【发布时间】:2010-02-06 13:31:33
【问题描述】:
很遗憾,Application.Invoke() 是异步的:
private string ThreadFunction(int i)
{
string result = null;
Gtk.Application.Invoke(delegate
{
OutputStringToUserInterface("i = " + i.ToString());
result = GetStringFromUserInterface();
});
return result;
}
这意味着在此示例中,ThreadFunction() 在调用Application.Invoke() 后立即继续,导致result 字符串可能处于未定义状态。 -- 通常ThreadFunction() 会更快并返回旧值(即null)。
这是使用ManualResetEvent 使Application.Invoke() 同步的解决方法:
private string ThreadFunction(int i)
{
string result = null;
using (var ev = new ManualResetEvent(false))
{
Gtk.Application.Invoke(delegate
{
OutputStringToUserInterface("i = " + i.ToString());
result = GetStringFromUserInterface();
ev.Set();
});
ev.WaitOne();
}
return result;
}
这样,ThreadFunction() 会一直等到Application.Invoke() 返回,就像使用WinForms Control.Invoke() 一样。
编辑:更好的示例代码
EDIT2:添加缺少的using
现在我的问题是:有更好的解决方案吗?
【问题讨论】:
标签: c# .net mono multithreading gtk#