我正在进行一些关于.NET异步编程的测试,现在我卡在了尝试使用cancellationToken取消长时间操作上。
所以我有以下代码:
CancellationTokenSource cancelationToken = new CancellationTokenSource();
我的按钮来启动操作
private void button2_Click(object sender, EventArgs e)
{
cancelationToken.Cancel(true);
}
private void button1_Click(object sender, EventArgs e)
{
StartOperation(cancelationToken.Token);
}
最后是我的操作。
private async void StartOperation(CancellationToken cancelToken)
{
await GetItensFromDatabase2(cancelToken);
}
public static Task<int> GetItensFromDatabase(CancellationToken cancelToken)
{
//cancelToken.Register( () => Console.WriteLine("Canceled") );
return Task.Factory.StartNew<int>(() =>
{
int result = 0;
cancelToken.ThrowIfCancellationRequested();
result = MyLongOperation(); // Simulates my operation -> I want to cancel while this operation is still running
return result;
}, cancelToken);
}
那么,如何取消MyLongOperation()方法?有可能吗?
async
代码时使用Task.Run
而不是StartNew
;我在我的博客中解释了原因。 - Stephen ClearyMicrosoft.Bcl.Async
中,它是TaskEx.Run
。 - Stephen Cleary