是将其中一个嵌套在另一个内部吗?过去,我遇到了一个挂起/死锁的问题,在执行最上面的代码块时可以重现,而当我将其更改为最下面的代码块时也无法重现。时间,但我仍然没有。我应该了解有关Lock和InvokeOnMainThread的组合的一些信息吗?我可以提供有关我正在做的事情的更多详细信息,但这比任何其他问题都更加笼统……
假设我要在后台线程中执行“DoStuff”。我有一个可以从多个线程访问的变量。
lock( stuff )
{
InvokeOnMainThread ( delegate {
stuff.DoStuff();
});
}
备用
InvokeOnMainThread ( delegate {
lock( stuff )
{
stuff.DoStuff();
}
});
添加了信息:ojit_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
现在,这并不能解释为什么第二个块可以解决比赛条件,但是我的猜测是,它只会改变比赛条件,足以使您不再击中它(因此无法解决它,只需将其隐藏即可)。