Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅在另一个任务成功完成时运行任务_C#_Wpf_Multithreading - Fatal编程技术网

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
be
async

这些方法不使用取消令牌,因此在您的情况下使用取消令牌(看起来)没有任何好处。这样不行吗

public async Task DoSomething()
{    
    await _clearerStagingService.SaveNewClearer(clearerStaging);
    await _auditService.CreateAudit(audit);
}

根据Liam的回答,您不需要每次为每个语句创建单独的任务 当您已经通过
createEntity.wait(cancelToken.Token)调用任务等待时

我还想添加关于CancellationTokenSource的内容


当您要明确取消任务时,您只需要
CancellationTokenSource
,否则无需使用
CancellationTokenSource.Token

Hmm您确定要在此处使用
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)
    {

    }