C#中取消async和await方法
Cancel async and await method in C#
我在 C# 中有一个异步调用,我正在尝试实现取消逻辑。我在 Internet 上进行了搜索,但找不到解决我的问题的方法。
我有一个 Windows 表单,其中包含一个“开始”按钮、一个“取消”按钮和一个用于显示结果的文本框。以下代码:
private CancellationTokenSource _cancelSource;
private CancellationToken _token;
private void btnStart_Click(object sender, EventArgs e)
{
DisplayPrimeCountsAsync(_token);
}
private async void DisplayPrimeCountsAsync(CancellationToken token)
{
btnStart.Enabled = false;
for (int i = 0; i < 100; i++)
{
textBox1.Text += await GetPrimesCountAsync(i*1000000 + 2, 1000000, token) + Environment.NewLine;
}
btnStart.Enabled = true;
}
private Task<int> GetPrimesCountAsync(int start, int count, CancellationToken token)
{
return
Task.Run(() =>
ParallelEnumerable.Range(start, count).Count(n =>
Enumerable.Range(2, (int) Math.Sqrt(n) - 1).All(i => n%i > 0)), token);
}
private void btnCancel_Click(object sender, EventArgs e)
{
_cancelSource = new CancellationTokenSource();
_token = _cancelSource.Token;
_cancelSource.Cancel();
btnCancel.Enabled = false;
}
现在这根本就没有被取消。我找到了以下代码:
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
但我不知道将它放在哪里。试图将它和素数 linq 表达式放入另一个方法并通过 Task.Run 调用此方法但没有任何帮助。有人可以告诉我如何以正确的方式实现这个取消逻辑吗?
提前致谢!
您是否在启动任务之前尝试调用以下代码?
_cancelSource = new CancellationTokenSource();
_token = _cancelSource.Token;
感觉就像当你启动你的任务时令牌是空的,然后你设置它。
(虽然没试过)
当然,在这种情况下,您必须从取消方法中删除相同的代码。
我在 C# 中有一个异步调用,我正在尝试实现取消逻辑。我在 Internet 上进行了搜索,但找不到解决我的问题的方法。
我有一个 Windows 表单,其中包含一个“开始”按钮、一个“取消”按钮和一个用于显示结果的文本框。以下代码:
private CancellationTokenSource _cancelSource;
private CancellationToken _token;
private void btnStart_Click(object sender, EventArgs e)
{
DisplayPrimeCountsAsync(_token);
}
private async void DisplayPrimeCountsAsync(CancellationToken token)
{
btnStart.Enabled = false;
for (int i = 0; i < 100; i++)
{
textBox1.Text += await GetPrimesCountAsync(i*1000000 + 2, 1000000, token) + Environment.NewLine;
}
btnStart.Enabled = true;
}
private Task<int> GetPrimesCountAsync(int start, int count, CancellationToken token)
{
return
Task.Run(() =>
ParallelEnumerable.Range(start, count).Count(n =>
Enumerable.Range(2, (int) Math.Sqrt(n) - 1).All(i => n%i > 0)), token);
}
private void btnCancel_Click(object sender, EventArgs e)
{
_cancelSource = new CancellationTokenSource();
_token = _cancelSource.Token;
_cancelSource.Cancel();
btnCancel.Enabled = false;
}
现在这根本就没有被取消。我找到了以下代码:
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
但我不知道将它放在哪里。试图将它和素数 linq 表达式放入另一个方法并通过 Task.Run 调用此方法但没有任何帮助。有人可以告诉我如何以正确的方式实现这个取消逻辑吗? 提前致谢!
您是否在启动任务之前尝试调用以下代码?
_cancelSource = new CancellationTokenSource();
_token = _cancelSource.Token;
感觉就像当你启动你的任务时令牌是空的,然后你设置它。 (虽然没试过)
当然,在这种情况下,您必须从取消方法中删除相同的代码。