Xamarin 什么时候在ViewModels中使用ConfigureAwait(false)会有问题?
我想知道在什么情况下使用时会遇到问题Xamarin 什么时候在ViewModels中使用ConfigureAwait(false)会有问题?,xamarin,mvvm,configureawait,Xamarin,Mvvm,Configureawait,我想知道在什么情况下使用时会遇到问题 ConfigureAwait(false) 在我的(Xamarin)MVVM方法中。这主要是因为我没有完全理解视图和视图模型的同步上下文及其属性和参考底图模型之间的相互关系 1可观察到的集合如何 // VM public ObservableCollection<SomeThing> SomeThings { get; set; } // ... public Task InitWorkload() { SomeThings = awa
ConfigureAwait(false)
在我的(Xamarin)MVVM方法中。这主要是因为我没有完全理解视图和视图模型的同步上下文及其属性和参考底图模型之间的相互关系
1可观察到的集合如何
// VM
public ObservableCollection<SomeThing> SomeThings { get; set; }
// ...
public Task InitWorkload()
{
SomeThings = await DbService.GetSomeThings(); // <-- Should need synchronization context, doesn't it?
}
// Service
public Task<SomeThings> GetSomeThings()
{
result = await CallToDb.ConfigureAwait(false); // <-- This is UI agnostic and shouldn't care about context or does it?
return result;
}
//VM
公共可观测集合某些事物{get;set;}
// ...
公共任务InitWorkload()
{
SomeThings=await DbService.GetSomeThings();//要回答标题问题,“什么时候在ViewModels中使用ConfigureAwait(false)
有问题?”是“从不”它在视图模型中的使用是不相关的。重要的是调用异步方法后要在哪个线程上运行,无论您是否在视图模型中都是不相关的。唯一一次使用configurewait(false)
如果要返回到调用异步方法之前运行的线程,可能会有问题
供参考,请参阅网站上的文档
也许解释ConfigureAwait(false)
所做的事情是回答这个问题的最佳方法。当调用这样的异步方法时:
var x = await SomeMethodAsync();
var y = x;
代码var y=x
将在调用异步方法之前正在执行工作的同一线程上运行,即异步方法调用之前的同步上下文,但是如果使用ConfigureWait(false),例如:
然后,代码var y=x
将在SomeMethodAsync
方法返回时运行的同一线程上运行。(大概SomeMethodAsync
使用Task.Run
或Thread.StartNew
这是启动新线程的主要方式…wait
不会启动新线程,它只是语法上的糖衣,允许异步代码更具可读性,这样异步方法调用后的代码就不必是反线程了legate方法或lambda,但可以像同步代码一样在线。)
因此,您需要什么取决于可能需要更新的内容。任何UI更新都需要在主线程或UI线程上运行。您始终可以使用设备将代码封送到主线程或UI线程。BeginInvokeMainThread(Action)
通常,当您处于按钮单击处理程序事件中时,事件处理程序方法开始在UI线程上运行。如果需要调用一个异步方法,然后更新某些UI,则不要使用ConfigureAwait(false)
这样,在使用异步方法后,您可以返回到主/UI线程,并可以更新您的UI。如果您不需要更新任何UI,请随时调用ConfigureAwait(false)
,以便在不需要在该线程上运行时,您不会不必要地返回UI线程
在某些情况下,如果从UI线程上启动的一个方法调用多个异步方法,可能需要使用ConfigureAwait(false)
这样,您就不会多次从后台线程返回UI线程,这会导致性能问题,而是所有非UI工作都在后台线程上完成,然后在需要时手动封送回UI线程
对于ObservableCollection
,它没有线程关联性,也就是说,当一个对象只能在创建它的同一个线程上更新或修改时,它也不是线程安全的,所以最好的计划是只在创建它的同一个线程上访问或更改ObservableCollection,最有可能是主/UI线程ead.要回答标题问题,“什么时候在ViewModels中使用ConfigureAwait(false)
有问题?”是“从不”它在视图模型中的使用是不相关的。重要的是调用异步方法后要在哪个线程上运行,无论您是否在视图模型中都是不相关的。唯一一次使用configurewait(false)
如果要返回到调用异步方法之前运行的线程,可能会有问题
供参考,请参阅网站上的文档
也许解释ConfigureAwait(false)
所做的事情是回答这个问题的最佳方法。当调用这样的异步方法时:
var x = await SomeMethodAsync();
var y = x;
代码var y=x
将在调用异步方法之前正在执行工作的同一线程上运行,即异步方法调用之前的同步上下文,但是如果使用ConfigureWait(false),例如:
然后,代码var y=x
将在SomeMethodAsync
方法返回时运行的同一线程上运行。(大概SomeMethodAsync
使用Task.Run
或Thread.StartNew
这是启动新线程的主要方式…wait
不会启动新线程,它只是语法上的糖衣,允许异步代码更具可读性,这样异步方法调用后的代码就不必是反线程了legate方法或lambda,但可以像同步代码一样在线。)
因此,您需要什么取决于可能需要更新的内容。任何UI更新都需要在主线程或UI线程上运行。您始终可以使用设备将代码封送到主线程或UI线程。BeginInvokeMainThread(Action)
通常,当您处于按钮单击处理程序事件中时,事件处理程序方法开始在UI线程上运行。如果需要调用一个异步方法,然后更新某些UI,则不要使用ConfigureAwait(false)
这样,在使用异步方法后,您可以返回到主/UI线程,并可以更新您的UI。如果您不需要更新任何UI,请随时调用ConfigureAwait(false)
,以便在不需要在该线程上运行时,您不会不必要地返回UI线程
在某些情况下,如果从UI线程上启动的一个方法调用多个异步方法,则可能会
var x = await SomeMethodAsync().ConfigureAwait(false);
var y = x;