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

标签 c# wpf multithreading ui-thread

我和this person had有同样的问题.然而,问题是通过使用 .Net 4.5 回答的,但我只有 .Net 4.0。

所以我基于this tutorial创建了自己的异步信号量并根据发布答案的人的附加评论实现了我的代码:

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 是并行调用的。

最佳答案

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

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

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

由于可以内联延续,因此很难预测它实际运行在哪个线程上。这是 TPL 中非常讨厌的非确定性。您可能应该为该延续指定 UI 任务调度程序。这样你就永远不需要编码。

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

关于c# - 使用 .Net 4.0 从 Lock() 中调用 UI 线程上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37862590/

相关文章:

c# - 延伸到列表框宽度但不超过宽度的列表框项目

c# - 在 .NET 中使用 key 的独占锁

java - 如何并行执行同步代码?

c# - 渲染前取消转义字符串中的转义字符

c# - 封一个类

wpf - 数据读取器不兼容...成员在数据读取器中没有对应的列

c# - View 模型继承和重复模型引用

multithreading - 如何检查 pthread 是否可连接?

javascript - Microsoft JScript 运行时错误

c# - linq to sql使用lambda连接多列