调用异步顺序可靠性
本文关键字:可靠性 顺序 异步 调用 | 更新日期: 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 方法页。