C# 仅在另一个任务成功完成时运行任务
我有一个任务,它实现了以下内容:C# 仅在另一个任务成功完成时运行任务,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个任务,它实现了以下内容: CancellationTokenSource cancelToken = new CancellationTokenSource(); Task createEntity = Task.Run(async () => { try { await _clearerStagingService.SaveNewClearer(clearerStaging); } catch (Exception ex)
CancellationTokenSource cancelToken = new CancellationTokenSource();
Task createEntity = Task.Run(async () =>
{
try
{
await _clearerStagingService.SaveNewClearer(clearerStaging);
}
catch (Exception ex)
{
cancelToken.Cancel();
Logger.SendError($"Failed to save", ex);
}
}, cancelToken.Token);
如您所见,在发生错误时调用取消令牌。这是因为我希望线程在失败时退出——这是在失败时安全退出线程的正确方法吗
然后,我实现了以下代码,该代码应仅在上述线程成功运行时运行:
createEntity.Wait(cancelToken.Token);
if (!cancelToken.IsCancellationRequested)
{
Task.Run(async () =>
{
try
{
await _auditService.CreateAudit(audit);
}
catch (Exception ex)
{
Logger.SendError("Could not create Audit.", ex);
}
});
}
我不确定这是否是实现取消令牌的方法,我试着四处看看,但还是很困惑
如果您能提供一些帮助,我们将不胜感激。为什么不简单地:
Task.Run(async () =>
{
try
{
await _clearerStagingService.SaveNewClearer(clearerStaging);
await _auditService.CreateAudit(audit);
}
catch (Exception ex)
{
}
});
如果savenewclear
抛出异常,则CreateAudit
将不会运行,CreateAudit
将在CreateAudit
之后运行Wait
将在执行async
操作时“暂停”任务,然后在任务返回暂停位置时恢复任务
如果任何操作失败,任务
将在没有任何取消令牌的情况下自然结束
我不确定您是否需要
任务。Run()
TBH,但我不知道WPF,所以我认为这是一个很好的理由,也许不阻塞UI线程?是的,这有点做作。但是,让async
beasync
这些方法不使用取消令牌,因此在您的情况下使用取消令牌(看起来)没有任何好处。这样不行吗
public async Task DoSomething()
{
await _clearerStagingService.SaveNewClearer(clearerStaging);
await _auditService.CreateAudit(audit);
}
根据Liam的回答,您不需要每次为每个语句创建单独的任务 当您已经通过
createEntity.wait(cancelToken.Token)调用任务等待时代码>
我还想添加关于CancellationTokenSource的内容
当您要明确取消任务时,您只需要CancellationTokenSource
,否则无需使用CancellationTokenSource.TokenHmm您确定要在此处使用task
?为什么不干脆wait\u clearStagingService.saveNewClear(clearStaging);wait_auditService.CreateAudit(审计)代码>?这有点像你试图在同步环境中运行异步代码method@Liam这是因为我使用的是WPF,这里的代码在ViewModel中一旦您使用了async
/wait
,您应该只考虑任务。如果您想启动CPU限制的任务,请运行。否则,请为async
/wait
找到一种方法,以进入所有代码-在某些情况下,这可能意味着您最终将编写async void
方法(用于事件。只需确保为未观察到的异常安装处理程序)。一旦您刚刚使用了wait
,这正是您编写代码的方式,在上一个任务成功完成后继续。我已经这样做了,但出于某种原因,当我故意让程序抛出一个例外时,程序在退出应用程序时挂起(按x按钮)。现在我想起来了,这应该是最明显的解决办法。不知道为什么我要创建两个独立的任务。
try
{
await _clearerStagingService.SaveNewClearer(clearerStaging);
await _auditService.CreateAudit(audit);
}
catch (Exception ex)
{
}