我有方法
public async Task doSomething()
在方法内部,我有代码:
ShowSpinner();
await System.Threading.Tasks.Task.Run(() =>
{
try
{
getValue = value();
}
catch(Exception ex)
{
}
finally
{
HideSpinner();
}
});
ShowSpinner()
和HideSpinner()
只是叠加,以防止用户与屏幕交互并显示指示加载的旋转轮。
我收到错误:
UIKit一致性错误:您正在调用只能使用的UIKit方法 从UI线程调用。
我知道这是因为HideSpinner()
。如何解决此一致性错误?
答案 0 :(得分:1)
你可以在这里做两件事,首选方法是在try finally块中等待你的任务,第二个不太优选的方法是将你的HideSpinner();
包裹在RunOnUiThread
中
ShowSpinner();
try
{
var val = await Task.Run(() => "foo");
// for a little added performance,
// if val isn't being marshalled to the UI
// you can use .ConfigureAwait(false);
// var val = await Task.Run(() => "foo").ConfigureAwait(false);
}
catch { /* gulp */}
finally { HideSpinner(); }
ShowSpinner();
await Task.Run(() =>
{
try
{
var val = "value";
}
catch { /* gulp */ }
finally
{
InvokeOnMainThread(() =>
{
HideSpinner();
});
}
});