- Регистрация
- 29.09.2013
- Сообщения
- 395
- Благодарностей
- 126
- Баллы
- 43
Перерыл форум, много кто спрашивал о таком коде или кубике, но решения так и нет.
Как я подумал решить это.
Перед выполнением основного потока, запускать параллельный поток async await с указанным таймаутом, после которого он должен бросить исключение.
Допустим ОСНОВНОЙ метод MainWork выполняется 5 секунд.
А параллельный 10.
После отработки основного потока, программа завершается, но потом выводятся логи параллельного потока.
Но если указать MainWork 10 секунд, а таймаут 5, и после таймаута выбросить исключение, то вырубается полностью и PM и ZP.
Кто-то может подскажет, как это можно реализовать?
Чтобы в случае успеха основного потока (MainWork) завершался параллельный поток.
А в случае если у параллельного потока закончилось время выполнения, то прерывался шаблон и основной и параллельный поток, БЕЗ падения ZP и PM?
Вызываю вот так
Давайте вместе сделаем что-то такое, из-за чего не будут висеть инстансы.
Как я подумал решить это.
Перед выполнением основного потока, запускать параллельный поток async await с указанным таймаутом, после которого он должен бросить исключение.
Допустим ОСНОВНОЙ метод MainWork выполняется 5 секунд.
А параллельный 10.
После отработки основного потока, программа завершается, но потом выводятся логи параллельного потока.
Но если указать MainWork 10 секунд, а таймаут 5, и после таймаута выбросить исключение, то вырубается полностью и PM и ZP.
Кто-то может подскажет, как это можно реализовать?
Чтобы в случае успеха основного потока (MainWork) завершался параллельный поток.
А в случае если у параллельного потока закончилось время выполнения, то прерывался шаблон и основной и параллельный поток, БЕЗ падения ZP и PM?
OwnCode:
namespace ZennoLab.OwnCode
{
/// <summary>
/// A simple class of the common code
/// </summary>
public class CommonCode
{
IZennoPosterProjectModel project;
public CommonCode(IZennoPosterProjectModel project)
{
this.project = project;
}
/// <summary>
/// Lock this object to mark part of code for single thread execution
/// </summary>
public static object SyncObject = new object();
public void Start()
{
project.SendInfoToLog("Start() Start");
TimeOutAsync(10);
MainWork(5);
project.SendInfoToLog("Start() Finish");
}
/// <summary>
/// Основная работа
/// </summary>
/// <param name="seconds"></param>
private void MainWork(int seconds)
{
project.SendInfoToLog("Основной поток MainWork() Start");
while (seconds >= 0)
{
project.SendInfoToLog(seconds.ToString());
Thread.Sleep(1000);
seconds--;
}
project.SendInfoToLog("Основной поток MainWork() Finish");
}
/// <summary>
/// Асинхронный метод для вызова "Отсчёта максимального времени выполнения приложения"
/// </summary>
/// <param name="seconds"></param>
private async void TimeOutAsync(int seconds)
{
project.SendInfoToLog("TimeOutAsync() Start");
await Task.Run(() => TimeOut(seconds));
project.SendInfoToLog("TimeOutAsync() Finish");
}
/// <summary>
/// Отсчёт максимального времени выполнения приложения
/// </summary>
/// <param name="seconds"></param>
private void TimeOut(int seconds)
{
project.SendInfoToLog("TimeOut() Start");
var ts = new TimeSpan(0, 0, seconds);
var sw = Stopwatch.StartNew();
while (sw.Elapsed < ts)
{
Thread.Sleep(1000);
}
project.SendInfoToLog("TimeOut() Finish");
//throw new Exception("TimeOut() Exception");
}
}
}
C#:
var common = new CommonCode(project);
common.Start();
Давайте вместе сделаем что-то такое, из-за чего не будут висеть инстансы.