gpt4 book ai didi

C# 5 Async Await .Task.Factory.StartNew 取消

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:44 24 4
gpt4 key购买 nike

我有实现取消 token 的异步代码。它正在运行,但我不太确定这是否是正确的方法,所以我只想要有关它的反馈。

这是实际的代码:

    /// <summary>
///
/// </summary>
private async void SaveData() {

if (GetActiveServiceRequest() != null)
{
var tokenSource = new System.Threading.CancellationTokenSource();


this.ShowWizardPleaseWait("Saving data...");

var someTask = System.Threading.Tasks.Task<bool>.Factory.StartNew(() =>
{

bool returnVal = false;

// Set sleep of 7 seconds to test the 5 seconds timeout.
System.Threading.Thread.Sleep(7000);

if (!tokenSource.IsCancellationRequested)
{
// if not cancelled then save data

App.Data.EmployeeWCF ws = new App.Data.EmployeeWCF ();
returnVal = ws.UpdateData(_employee.Data);
ws.Dispose();
}

return returnVal;

}, tokenSource.Token);


if (await System.Threading.Tasks.Task.WhenAny(someTask, System.Threading.Tasks.Task.Delay(5000)) == someTask)
{
// Completed
this.HideWizardPleaseWait();
if (someTask.Result)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
else
{
this.DialogResult = System.Windows.Forms.DialogResult.Abort;
}
btnOK.Enabled = true;
this.Close();
}
else
{
tokenSource.Cancel();

// Timeout logic
this.HideWizardPleaseWait();
MessageBox.Show("Timeout. Please try again.")
}


}
}

async/await/cancellation 代码是否实现良好?

感谢并感谢反馈。

最佳答案

一般来说,您应该使用ThrowIfCancellationRequested。这将在取消状态下完成返回的 Task,而不是在结果为 false 的“成功运行至完成”状态下。

其他要点:

  • 避免async void。这应该是 async Task 除非它是一个事件处理程序。
  • Prefer Task.Run over TaskFactory.StartNew .
  • 使用使用
  • 如果您只是将 CancellationTokenSource 用作超时,那么它具有特殊的功能。无需通过 Task.DelayTask.WhenAny 创建单独的任务。

更新后的代码如下所示:

private async Task SaveData()
{
if (GetActiveServiceRequest() != null)
{
var tokenSource = new System.Threading.CancellationTokenSource(TimeSpan.FromSeconds(5));
var token = tokenSource.Token;

this.ShowWizardPleaseWait("Saving data...");

var someTask = System.Threading.Tasks.Task.Run(() =>
{
// Set sleep of 7 seconds to test the 5 seconds timeout.
System.Threading.Thread.Sleep(7000);

// if not cancelled then save data
token.ThrowIfCancellationRequested();
using (App.Data.EmployeeWCF ws = new App.Data.EmployeeWCF())
{
return ws.UpdateData(_employee.Data);
}
}, token);

try
{
var result = await someTask;

// Completed
this.HideWizardPleaseWait();
if (result)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
else
{
this.DialogResult = System.Windows.Forms.DialogResult.Abort;
}
btnOK.Enabled = true;
this.Close();
}
catch (OperationCanceledException)
{
// Timeout logic
this.HideWizardPleaseWait();
MessageBox.Show("Timeout. Please try again.")
}
}
}

关于C# 5 Async Await .Task.Factory.StartNew 取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com