Переработал и протестировал код.
Обновленное решение работает стабильно в ProjectMaker и ZennoPoster.
В общий код добавляем класс:
public class Timeout
{
private IZennoPosterProjectModel _project = null;
private int _timeoutInSeconds = 0;
private CancellationTokenSource _cancellationTokenSource = null;
public Timeout(IZennoPosterProjectModel project, int timeoutInSeconds)
{
_project = project;
_timeoutInSeconds = timeoutInSeconds;
_cancellationTokenSource = new CancellationTokenSource();
}
public void Start()
{
var thread = Thread.CurrentThread;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
_project.SendInfoToLog($"Запускаем фоновый поток: {Thread.CurrentThread.ManagedThreadId}", true);
var endTime = DateTime.Now.AddSeconds(Convert.ToDouble(_timeoutInSeconds));
while (true)
{
Thread.Sleep(100);
if (_cancellationTokenSource.Token.IsCancellationRequested)
{
_project.SendInfoToLog($"Останавливаем фоновый поток: {Thread.CurrentThread.ManagedThreadId}", true);
break;
}
var currentTime = DateTime.Now;
if (currentTime >= endTime)
{
_project.SendInfoToLog($"Останавливаем основной поток: {thread.ManagedThreadId}", true);
_project.SendInfoToLog($"Останавливаем фоновый поток: {Thread.CurrentThread.ManagedThreadId}", true);
thread.Interrupt();
break;
}
}
}, _cancellationTokenSource.Token);
}
public void Stop()
{
_cancellationTokenSource.Cancel();
Thread.Sleep(1000);
}
}
Первый кубик в проекте для запуска фонового потока с проверкой по таймауту:
// запускаем проверку в фоновном потоке с таймаутом в 5 секунд
project.Context["timeout"] = new Timeout(project, 5);
(project.Context["timeout"] as Timeout).Start();
Второй кубик в проекте для имитации выполнения разных задач:
// имитируем долгое выполнение в течении 10 секунд
for (int counter = 0; counter < 10; counter++)
{
project.SendInfoToLog($"Поток: {Thread.CurrentThread.ManagedThreadId} Счетчик: {counter}", true);
Thread.Sleep(1000);
}
Кубик завершения проекта по Bad End и Good End для завершения фонового потока:
(project.Context["timeout"] as Timeout).Stop();
Прикрепил к сообщению тестовый проект, работает на версии 7.2 и выше.
Если вам пригодилось решение, достаточно нажать на кнопку Спасибо под сообщением.