Завершение массива задач Task с использованием CancellationToken - C#
Формулировка задачи:
В продолжение темы.
Передача метода в класс BackgroundWorker
к Backgroundworker это уже не относится.
Вроде как и все нормально, спасибо за помощь, но уткнулся в странный эксепшен на завершении Tasks через "OperationCanceledException was unhandled by user code"
Как пишут тут
http://stackoverflow.com/questions/1...rallel-foreach
http://stackoverflow.com/questions/7...g-an-exception
должно решаться это использованием try {} catch(){}, что логично и сразу же пробовал, но не помогает.
Вот полный код
Worker.cs
Form1.cs
CancellationToken
. эксепшен вылетает (и сместе с ним приложение крешится) на строке вызова этого самого эксепшена.cancellationToken.ThrowIfCancellationRequested();
class Worker
{
public static int threadCount { get; set; }
Task[] tasks;
//ex data
public static string exception;
static CancellationTokenSource wtoken = new CancellationTokenSource();
CancellationToken cancellationToken = wtoken.Token;
public void doWork(ParameterizedThreadStart method)
{
try
{
tasks = Enumerable.Range(0, threadCount).Select(i => Task.Factory.StartNew(() =>
{
while (true)
{
if (tasks[i].IsFaulted == true) { break; }
cancellationToken.ThrowIfCancellationRequested();
method(i);
}
}, cancellationToken)).ToArray();
}
catch (Exception ex) { exception = ex.Message; }
}
public void HardStop()
{
try
{
using (wtoken)
{
wtoken.Cancel();
}
wtoken = null;
tasks = null;
}
catch (Exception ex) { exception = ex.Message; }
}
} private void Start_btn_Click(object sender, EventArgs e)
{
Worker.threadCount = 4;
Worker worker = new Worker();
worker.doWork(Job);
string logString_1 = string.Format("Starting {0} threads...", Worker.threadCount);
log(logString_1);
}
public static int j = 0;
private void Job(object sender)
{
Worker worker = new Worker();
Random r = new Random();
log("Thread "+Thread.CurrentThread.ManagedThreadId +" is working...");
for (int i = 0; i < 5; i++)
{
j++;
log("J==" + j);
if (j == 50)
{
worker.HardStop();
log("STOP");
}
}
Thread.Sleep(r.Next(500, 1000));
}Решение задачи: «Завершение массива задач Task с использованием CancellationToken»
textual
Листинг программы
public void HardStop()
{
try
{
using (wtoken)
{
wtoken.Cancel();
}
wtoken = new CancellationTokenSource();
tasks = null;
}
catch (Exception ex) { exception = ex.Message; }
}