Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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_Invoke - Fatal编程技术网

C# 调用同步顺序可靠性

C# 调用同步顺序可靠性,c#,wpf,invoke,C#,Wpf,Invoke,我有一个关于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(() => {

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

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

Task.Factory.StartNew(() => DoSomethingWith(filePath)).ContinueWith((
    Task resultFromPrevious) => DoSomethingElseWith(resultFromPrevious),  
    TaskScheduler.FromCurrentSynchronizationContext())
在这种情况下,
TaskScheduler.FromCurrentSynchronizationContext()
选项将使
doSomethingelsWith
方法在UI线程上运行


您可能想查看MSDN上的页面。

不确定您的文件路径是什么,但会查看任务-排序与将代码从a中的调用复制到b中的调用结尾相同否?它只是向您展示了您可以在这些方法中使用局部变量,但我可能应该提到这一点。不,不是真的。。。第一部分将异步运行,并使用
TaskScheduler。FromCurrentSynchronizationContext()
选项将使第二部分在UI线程上运行。即使你不选择这个选项,它仍然是不一样的,因为它们将在不同的异步上下文中运行,但第二部分将等待第一部分完成。我最终做了一些重构,解决了这个问题,但这是我在重构之前寻找的答案-谢谢