来自等待Task.Run的UIKITThreadAccessException,带有try-catch-finally块

时间:2015-07-14 17:04:32

标签: c# asynchronous xamarin try-catch

我有方法

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()。如何解决此一致性错误?

1 个答案:

答案 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();
        });

    }
});