如何更好地在Xamarin.Forms上使用AsyncNetwork来使用ObservableCollection?

如何更好地在Xamarin.Forms上使用AsyncNetwork来使用ObservableCollection?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在使用Xamarin.forms制作应用程序。 它工作得很好 但问题是大部分时间都很好,但有时会崩溃。 我猜其中一个线索是我使用ObservableCollection的方式是错误的。 当我使用背景线程时,我应该小心使用它,不是吗 我在下面写了不同的类型。 请告诉我最好的使用方法 选项2是正确的使用方法吗?(应该吗?) (我在询问必须调用异步方法或匿名方法的情况) 谢谢 选项1(我一直在使用此选项) 选择2 选择3 选择4 如果需要在异步操作后在UI线程上执行某些操作,则不应在此层中使用Co

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

但问题是大部分时间都很好,但有时会崩溃。 我猜其中一个线索是我使用ObservableCollection的方式是错误的。 当我使用背景线程时,我应该小心使用它,不是吗

我在下面写了不同的类型。 请告诉我最好的使用方法

选项2是正确的使用方法吗?(应该吗?) (我在询问必须调用异步方法或匿名方法的情况)

谢谢

选项1(我一直在使用此选项) 选择2 选择3 选择4
如果需要在异步操作后在UI线程上执行某些操作,则不应在此层中使用
ConfigureAwait(false)
。在我看来,使用
ConfigureAwait(false)
然后使用
Device.beginInvokeMainThread(…)
是一种反模式,因为您关闭了对调用线程的自动分派,而调用线程会为您进行
await

async void SomeMethod()
{
var result=wait client.PostAsync(url、内容);
if(result.StatusCode==HttpStatusCode.OK)
{
ImObservableCollection.Add(某物);
}
}
如果
SomeMethod
的调用线程不是UI线程,则可以使用:

async void SomeMethod()
{
var result=await client.PostAsync(url、内容).ConfigureAwait(false);
if(result.StatusCode==HttpStatusCode.OK)
{
Device.beginInvokeMainThread(()=>ImObservableCollection.Add(something));
}
} 
这就是一般性的答案。请将错误消息添加到您的问题中,以便我们检查其他可能的错误原因


注意:如果
Somemethod
不是回调或事件处理程序,请使用
Task
而不是
void
作为返回值。这是一个最佳实践。

崩溃后的堆栈跟踪显示了什么?请将其添加到您的帖子中。否则,你就很难帮助汉克斯·斯文了。大家好,我是xabre的ble插件github的开发者。
void SomeMethod()
{
    Task.Run(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            ImObservableCollection.Add(something);
        }
    }
}
void SomeMethod()
{
    Task.Run(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            Device.BeginInvokeOnMainThread(() => ImObservableCollection.Add(something));
        }
    }
}
void SomeMethod()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        var result = await client.PostAsync(url, content).ConfigureAwait(false);
        if (result.StatusCode == HttpStatusCode.OK)
        {
            ImObservableCollection.Add(something);
        }
    }
}
void SomeMethod()
{
    getsomething();
}

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