使用.Net 4.0

时间:2016-06-16 14:50:06

标签: c# wpf multithreading ui-thread

我遇到与this person had相同的问题。然而,使用.Net 4.5回答了这个问题,但我只有.Net 4.0。

所以我基于this tutorial创建了自己的异步信号量,并根据发布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是并行调用的。

1 个答案:

答案 0 :(得分:4)

你过早发布信号量。最后在ContinueWith处理程序中释放它。

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

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

由于可以内联延续,因此很难预测它实际运行的是什么线程。这在TPL中是非常讨厌的非决定论。您可能应该为该延续指定UI任务调度程序。这样你就不需要编组了。

另请注意,您可以在.NET 4.0上使用等待,所以也许这个问题没有实际意义。