Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 使用.Net 4.0从Lock()中调用UI线程上的方法_C#_Wpf_Multithreading_Ui Thread - Fatal编程技术网

C# 使用.Net 4.0从Lock()中调用UI线程上的方法

C# 使用.Net 4.0从Lock()中调用UI线程上的方法,c#,wpf,multithreading,ui-thread,C#,Wpf,Multithreading,Ui Thread,我和你有同样的问题。然而,这个问题是用.NET4.5回答的,但我只有.NET4.0 因此,我根据发布anwer的人的附加注释创建了自己的异步信号量,并实现了自己的代码: private void Foo() { try { Semaphore.WaitAsync().ContinueWith(previousTask => { if (Dispatcher.FromThread(Thread.CurrentThread

我和你有同样的问题。然而,这个问题是用.NET4.5回答的,但我只有.NET4.0

因此,我根据发布anwer的人的附加注释创建了自己的异步信号量,并实现了自己的代码:

private void Foo()
{
    try
    {
        Semaphore.WaitAsync().ContinueWith(previousTask =>
        {
            if (Dispatcher.FromThread(Thread.CurrentThread) != null)
            {
                Bar();
            }
            else
            {
                Application.Current.Dispatcher.Invoke(new Action(() => Bar()));
            }
        });
    }
    finally
    {
        Semaphore.Release();
    }
}

但这对我来说不起作用,Bar是并行调用的。

您释放信号量太早了。在
continue中释放它,并在末尾使用
处理程序

您是否知道
Foo()
将立即返回,而不管同步代码是否实际运行

if(Dispatcher.FromThread(Thread.CurrentThread)!=null)
也非常可疑。您应该知道是否需要封送

因为continuations可以内联,所以很难预测它实际运行的线程。这在第三方物流中是相当令人讨厌的非决定论。您可能应该为该延续指定UI任务计划程序。这样你就不需要指挥了


另外请注意,您可以在.NET 4.0上使用wait,因此这个问题可能没有意义。

您正在异步发生之前释放信号量。您应该使用
wait
而不是所有这些。@SLaks:我没有.Net 4.5。然后使用Microsoft.Bcl.Async。只需在Bar()调用之后移动Release()调用即可。lambda表达式并不总是正确的选择,将延续代码移动到单独的方法中更容易解决这一问题。