在一个线程中,我创建一些System.Threading.Task并启动每个任务.
当我做一个.Abort()杀死线程时,任务不会中止.
我怎样才能传递.Abort()给我的任务?
所以我知道你不应该使用
Thread.Abort()
Run Code Online (Sandbox Code Playgroud)
但我从未得到过很好的解释.是否存在性能损失或隐藏的问题?
我知道你不能忽略/吞下ThreadAbortException(这是有道理的)
我有这个代码处理的Web请求;
Response = await Client.SendAsync(Message, HttpCompletionOption.ResponseHeadersRead, CToken);
Run Code Online (Sandbox Code Playgroud)
在读取响应头之后和内容完成读取之前返回.当我打电话给这一行来获取内容时......
return await Response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)
我希望能在X秒后停止它.但它不接受取消令牌.
我可以用一些方法来杀死.NET 4.0 Task对象,就像我们可以使用旧的和危险的Thread.Abort()一样,在SO线程中讨论(双关语并保存小猫!)
肯尼
我正在使用具有async方法但不是CancellationToken重载的外部库.
现在我正在使用另一个StackOverflow问题的扩展方法来添加CancellationToken:
public async static Task HandleCancellation(this Task asyncTask, CancellationToken cancellationToken)
{
// Create another task that completes as soon as cancellation is requested. http://stackoverflow.com/a/18672893/1149773
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
cancellationToken.Register(() =>
tcs.TrySetCanceled(), useSynchronizationContext: false);
Task cancellationTask = tcs.Task;
// Create a task that completes when either the async operation completes, or
// cancellation is requested.
Task readyTask = await Task.WhenAny(asyncTask, cancellationTask);
// In case of cancellation, register a continuation to observe any unhandled …Run Code Online (Sandbox Code Playgroud) 我想取消正在运行的任务(当用户按下退出键时)。当我点击“escape”键 Form_KeyDown 运行但不取消任务时!
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token=new CancellationToken();
private async void Search_Button_ClickAsync(object sender, EventArgs e)
{
token = tokenSource.Token;
await (Task.Factory.StartNew(() =>
{
//...my program
},
token));
private void Form_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
tokenSource.Cancel();
}
}
Run Code Online (Sandbox Code Playgroud) c# task cancellation cancellationtokensource cancellation-token
我只有一个同步操作,可能需要很多时间才能完成。该操作的调用者提供了一个CancellationToken符号,并且在令牌被取消后,该操作应立即停止(在这种情况下,取消后的几毫秒内也将起作用)。
如何将其包装在带有CancellationToken的任务中?
我无法更改调用代码或调用本身。
曾经是: LongOperation();
我现在所拥有的: await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);
显然,这是行不通的,因为您必须在给的操作中轮询令牌Task.Run。