我正在使用MVVMCross和我的跨平台Windows Phone和Android应用程序。在核心项目的主视图模型中,我正在使用TPL进行一些后台工作,我想确保在回调中,当我更改视图模型的属性时会触发UI更改,代码在UI线程上运行,我该如何实现?
对于代码,这是它喜欢的方式
private MvxGeoLocation _currentLocation;
private Task<MvxGeoLocation> GetCurrentLocation()
{
return Task.Factory.StartNew(() =>
{
while (_currentLocation == null && !LocationRetrievalFailed)
{
}
return _currentLocation;
});
}
var location = await GetCurrentLocation();
if (LocationRetrievalFailed)
{
if (location == null)
{
ReverseGeocodingRequestFailed = true;
return;
}
// Show toast saying that we are using the last known location
}
Address = await GooglePlaceApiClient.ReverseGeocoding(location);
答案 0 :(得分:15)
你试过IMvxMainThreadDispatcher
吗?
var dispatcher = Mvx.Resolve<IMvxMainThreadDispatcher>();
dispatcher.RequestMainThreadAction(()=> { .... });
详细了解实施情况:
https://github.com/MvvmCross/MvvmCross/search?q=IMvxMainThreadDispatcher&type=Code
通常我觉得你不需要这个。
由于您从主线程启动异步处理,异步操作应该返回主线程。
您能举例说明您正在做的异步代码吗?
答案 1 :(得分:2)
方法class CustomInput extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<input type={this.props.type} onClick={props.OnClick} />
</div>
</div>
);
}
}
现在已过时。今天,您必须要做
RequestMainThreadAction
答案 2 :(得分:2)
2020年8月24日更新:
正如@ claudio-redi所提到的,需要使用ExecuteOnMainThreadAsync
。但是Mvx.Resolve
现在已过时。因此,最新的代码段为:
var mainThreadAsyncDispatcher = Mvx.IoCProvider.Resolve<IMvxMainThreadAsyncDispatcher>();
await mainThreadAsyncDispatcher.ExecuteOnMainThreadAsync( async ()=> { await SomeAsyncTask() });