【发布时间】:2017-06-19 02:12:32
【问题描述】:
我在加载给定页面时通过 WCF 加载一些数据。然后,我想在数据加载后用值填充 Picker。但是,我遇到了跨线程问题。代码如下:
protected async override void OnAppearing()
{
base.OnAppearing();
await Task.Factory.StartNew(async () => { await Initialise(); });
}
private async Task Initialise()
{
var activities = await App.XivicServicesClient.DataAccessCalls.GetRecordsAsync<ActivityDef>(null, new ConnectionInfo(null, App.XivicServicesClient.AuthToken));
var activityCodes = activities.Select(a => a.Code);
foreach (var activityCode in activityCodes)
{
ActivityPicker.Items.Add(activityCode);
}
}
在 Windows UWP 中,我得到的错误是
附加信息:应用程序调用了为不同线程编组的接口。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))
我想我正在以一种意想不到的方式使用 OnAppearing 调用,那么我应该如何解决这个问题?我需要在页面开始加载时进行基于任务的异步 WCF 调用。
在 iOS 上,我没有收到错误消息。
【问题讨论】:
-
如前所述,您不应在此处使用
Task.Factory.StartNew。更何况Task.Factory.StartNew是一种危险的方法;即使您想要在后台线程上运行代码,也几乎不应该使用它(改用Task.Run)。
标签: c# multithreading wcf xamarin xamarin.forms