我开始了一些关于 .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() 方法呢?可以吗?
最佳答案
在任何时候都不可能取消,CancellationToken 的目的是允许用户取消操作,当长时间运行的操作期望...
while(!finished)
{
cancelToken.ThrowIfCancellationRequested();
//Some not cancelable operations
}
这里是cancelable方法比较常用的方法
private static void LongRunning(CancellationToken cancelToken)
{
while (true)
{
if(cancelToken.IsCancellationRequested)
{
return;
}
//Not canceled, continue to work
}
}
想法是,用户请求取消,但只有执行者决定何时停止他的工作。通常执行者在达到某个“安全点”后进行取消
在不征求意见的情况下中止
长时间运行的操作不是很好的体验,很多帖子都写过这个。
关于c# - 操作运行时异步取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134740/