如何在Xamarin.Forms上使用AsyncNetwork以更好的方式使用ObservableCollection?

时间:2017-01-11 07:44:59

标签: xamarin xamarin.forms

我正在使用Xamarin.forms制作应用程序。 它很棒。

但问题是大多数时间工作正常但有时会崩溃。 我猜测的一个线索就是我使用ObservableCollection的方式是错误的。 当我将它与后台线程一起使用时,我应该小心使用它,不应该吗?

我在下面写了不同的类型。 请让我知道最好的使用方法是什么。

选项2是否正确使用它? (还应该?) (当我必须调用异步方法或匿名方法时,我要求的情况)

感谢。

选项1(我一直在使用它)

void SomeMethod()
{
    Task.Run(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            ImObservableCollection.Add(something);
        }
    }
}

选项2

void SomeMethod()
{
    Task.Run(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            Device.BeginInvokeOnMainThread(() => ImObservableCollection.Add(something));
        }
    }
}

选项3

void SomeMethod()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            ImObservableCollection.Add(something);
        }
    }
}

选项4

void SomeMethod()
{
    getsomething();
}

void async getsomething()
{
    var result = await client.PostAsync(url, content).ConfigureAwait(false);
    if (result.StatusCode == HttpStatusCode.OK)
    {
        ImObservableCollection.Add(something);
    }
}

1 个答案:

答案 0 :(得分:1)

如果您需要在异步操作后在UI线程上执行某些操作,则不应在此层中使用ConfigureAwait(false)。在我看来,使用ConfigureAwait(false)然后使用Device.BeginInvokeOnMainThread(...)是一种反模式,因为您关闭自动调度到为您执行await的调用线程。

async void SomeMethod()
{
    var result = await client.PostAsync(url, content);
    if (result.StatusCode == HttpStatusCode.OK)
    {
        ImObservableCollection.Add(something);
    }
}

如果SomeMethod的调用线程不是UI线程,那么您可以使用:

async void SomeMethod()
{
    var result = await client.PostAsync(url, content).ConfigureAwait(false);
    if (result.StatusCode == HttpStatusCode.OK)
    {
        Device.BeginInvokeOnMainThread(() => ImObservableCollection.Add(something));
    }
} 

所以这是一般答案。请在您的问题中添加错误消息,以便我们检查其他可能的错误原因。

注意:如果Somemethod不是回调或事件处理程序,请使用Task代替void作为返回值。这是一种最佳做法。