是将其中一个嵌套在另一个内部吗?过去,我遇到了一个挂起/死锁的问题,在执行最上面的代码块时可以重现,而当我将其更改为最下面的代码块时也无法重现。时间,但我仍然没有。我应该了解有关Lock和InvokeOnMainThread的组合的一些信息吗?我可以提供有关我正在做的事情的更多详细信息,但这比任何其他问题都更加笼统……

假设我要在后台线程中执行“DoStuff”。我有一个可以从多个线程访问的变量。

lock( stuff )
{
    InvokeOnMainThread ( delegate {
        stuff.DoStuff();
    });
}

备用
InvokeOnMainThread ( delegate {
    lock( stuff )
    {
        stuff.DoStuff();
    }
});

添加了信息:o​​jit_rstrong我有一个带有连接管理器功能的iOS应用程序,该应用程序在后台线程中运行。连接管理器功能负责保持 Activity 状态并管理异步网络套接字连接。在很多情况下,在执行操作时需要InvokeOnMainThread,否则我将收到以下错误“UIKit一致性错误:您正在调用只能从UI线程调用的UIKit方法”。

最佳答案

两者之间的区别在于,在您执行DoStuff之前,第二个代码块不会阻止任何内容在执行线程上执行。

例子:

 lock (stuff) {
     InvokeOnMainThread ( delegate { Console.WriteLine ("a"); } }
 }
 Console.WriteLine ("b");

将打印:
a
b

而这段代码:
 InvokeOnMainThread ( delegate {
    lock (stuff) {
        Console.WriteLine ("a");
    }
 }
 Console.WriteLine ("b");

通常(但不一定)打印:
b
a

现在,这并不能解释为什么第二个块可以解决比赛条件,但是我的猜测是,它只会改变比赛条件,足以使您不再击中它(因此无法解决它,只需将其隐藏即可)。

10-08 13:09