【问题标题】:InvokeAsync order reliabilityInvokeAsync 订单可靠性
【发布时间】:2013-10-11 18:35:55
【问题描述】:

我有一个关于 invokeAsync 的问题,以及 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 个调用的问题,或者这是否可以可靠地遵循我提到的执行顺序?如果有机会解决问题,有什么想法可以让它变得更好吗?

【问题讨论】:

    标签: c# wpf invoke


    【解决方案1】:

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

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

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

    您可能想查看 MSDN 上的 Task.ContinueWith Method 页面。

    【讨论】:

    • 不确定您的 filePath 是什么,但会查看任务 - 这种排序与将代码从 a 中的调用复制到 b 中的调用末尾没有?
    • 这只是向您展示了您可以在这些方法中使用局部变量,但我可能应该提到这一点。不,不是真的...第一部分将异步运行,使用 TaskScheduler.FromCurrentSynchronizationContext() 选项将使第二部分在 UI 线程上运行。即使您关闭了该选项,它仍然不一样,因为它们将在不同的异步上下文中运行,但第二部分将等待第一个完成。
    • 我最终做了一些重构,解决了这个问题,但这是我在重构之前一直在寻找的答案 - 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2013-06-28
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多