我想创建一个在单独的线程(非GUI线程)上运行的任务。代码似乎运行良好,但我无法使取消逻辑工作。
我在Run
中有一个Cancell
按钮和GUI
按钮。我取消了令牌 - 我得到了System.Reflection.TargetInvocationException
。 InnerMessage
operation is cancelled
说我个人对此没有任何问题:)
我应该担心这个例外吗?我应该怎么处理?我尝试了try
- catch
块,但它们没有抓住它。
使用VS2015
。一些设置:
代码:
public CancellationTokenSource ts;
private async void button16_Click(object sender, EventArgs e)
{
await DoWork2();
}
public async Task DoWork2()
{
textBox1.AppendText("Started!");
ts = new CancellationTokenSource();
CancellationToken ct = ts.Token;
await Task.Run(() => // async
{
while (true)
{
//Thread.Sleep(200);
ct.ThrowIfCancellationRequested();
}
}, ct);
ts.Cancel();
textBox1.AppendText("Done!");
}
private void button28_Click(object sender, EventArgs e)
{
ts.Cancel();
}
编辑:我能够解决上述代码的问题!在任务中添加了OperationCancelledException
catch块。现在,上面的代码没有抛出异常。以下代码不是这种情况。
List<int> list1 = new List<int>();
for (int i = 0; i < 10; i++)
{
list1.Add(i);
}
await Task.Run(() => // async
{
try
{
while (true)
{
Parallel.ForEach(list1, int2 =>
{
// {Cancellation Pending}
ct.ThrowIfCancellationRequested();
});
}
}
catch (OperationCanceledException)// (OperationCanceledException ex)
{
}
}, ct);
如您所见 - 我在任务中有并行循环。这一定是问题所在。在这种情况下,即使是catch块也无济于事。有什么想法吗?
EDIT2:好的,我也能解决第二个问题。 nice tutorial from Microsoft
ParallelOptions po = new ParallelOptions();
po.CancellationToken = ts.Token;
和内循环:
while (true)
{
Parallel.ForEach(list1, po, int2 =>
{
// {Cancellation Pending}
po.CancellationToken.ThrowIfCancellationRequested();
});
}
对不起,这个问题现在已经解决,但也许有人想留下任何评论或者因为我采取的方法而责备我 - 如果没有评论,我会关闭这个问题