UI线程问题与MVVMCross中的视图模型

时间:2014-02-12 13:54:27

标签: mvvm mvvmcross

我正在使用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);

3 个答案:

答案 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() });