我正在使用Xamarin.forms制作应用程序。 它很棒。
但问题是大多数时间工作正常但有时会崩溃。 我猜测的一个线索就是我使用ObservableCollection的方式是错误的。 当我将它与后台线程一起使用时,我应该小心使用它,不应该吗?
我在下面写了不同的类型。 请让我知道最好的使用方法是什么。
选项2是否正确使用它? (还应该?) (当我必须调用异步方法或匿名方法时,我要求的情况)
感谢。
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);
}
}
答案 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
作为返回值。这是一种最佳做法。