调用异步顺序可靠性

本文关键字:可靠性 顺序 异步 调用 | 更新日期: 2023-09-27 18:34:49

我有一个关于调用异步的问题,以及 cal 顺序是否可以被视为可靠。

例:

//Get Dispatcher of UI Thread
private Dispatcher _dsp = Dispatcher.CurrentDispatcher;
//Method called from non-UI Thread
private void a() {
    //Do Stuff
    b();
    _dsp.InvokeAsync(() => {
          //Do Stuff in UI Thread
    });
}
private void b() {
    //Do stuff
    _dsp.InvokeAsync(() => {
        //Do stuff in UI Thread
    });
}

我是否可以理所当然地认为 b 的 InvokeAsync 中的代码将在 a' InvokeAsync 中的代码之前运行,因为它首先放入 UI 线程的调度程序中,或者在这种情况下,大多数时候 b 将首先运行,但在奇怪的情况下,它可能是相反的方式,甚至更糟, 在两者之间跳跃?

基本上,我会在某个时候遇到这 2 个调用的问题,还是可以 nad 可靠地遵循我提到的执行顺序?如果有机会解决问题,有什么想法可以把它做好吗?

调用异步顺序可靠性

我不

相信您可以对任何异步操作的运行顺序做出任何假设。但是,如果需要它们按顺序运行,则可以使用 Task 类执行以下操作:

Task.Factory.StartNew(() => DoSomethingWith(filePath)).ContinueWith((
    Task resultFromPrevious) => DoSomethingElseWith(resultFromPrevious),  
    TaskScheduler.FromCurrentSynchronizationContext())

在这种情况下,TaskScheduler.FromCurrentSynchronizationContext() 选项将使 DoSomethingElseWith 方法在 UI 线程上运行。

您可能需要查看 MSDN 上的 Task.ContinueWith 方法页。