如果我UIView.StringSize
从诸如 a 之类的异步代码中运行Task.ContinueWith
,它会以 aUIKitThreadAccessException
开头,因为该方法以调用开始UIApplication.EnsureUIThread
(MonoDevelop 中的“转到声明”;我不确定许可证是否允许我在此处发布)。
Task.Factory.StartNew(() => {
// Blows up discretely...nothing written to application output.
// Also blows up for UIViews that exist only in code (not rendered).
SizeF textSize = someView.StringSize(someString, someFont, new SizeF(someView.Bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
});
如果我将这个简化版本包含在 中InvokeOnMainThread
,一切都很好,但我肯定有时间想在没有那个调用的情况下测量一些文本。同样,我完全理解异常的目的,并且在之前调用异步代码深处的东西时,它为我节省了很多麻烦,但在这种情况下,EnsureUIThread
似乎没有必要使用这里。如果我只是简单地将该调用重申为对该NSString
类的一次点击,它将很高兴地在 UI 线程之外运行。
Task.Factory.StartNew(() => {
// Outputs expected size data: "{Width=##, Height=##}".
using (NSString nssSomeString = new NSString(someString)) {
SizeF textSize = nssSomeString.StringSize(someFont, new SizeF(someView.Bounds.Width, float.MaxValue), UILineBreakMode.WordWrap);
Console.WriteLine(textSize);
}
});
的代码UIView.StringSize
似乎做了大致相同的NSString
工作,并且似乎没有任何明显的面向 UI 线程的东西。我是否缺少需要从 UI 线程调用此版本的方法的内容?
编辑(2013-01-17):
我向 Xamarin 提交了一个错误,只是为了查看他们的回复。听起来他们正在考虑将此方法标记为ThreadSafe
.