Windows 8 - 异步等待For循环时的线程错误

时间:2012-10-03 17:21:30

标签: c# multithreading windows-8 windows-runtime

我正在尝试在Windows 8应用中加载已保存的数据。所有方法都是异步的。当await GetStoredActivitiesInFolder(groupFolder);第二次在for循环中运行时,我得到一个错误,因为线程仍在处理第一个(我猜)。

错误(当我删除上面的代码行时它就消失了):

  

“System.Runtime.InteropServices.COMException”类型的异常   发生在mscorlib.dll中但未在用户代码中处理

     

附加信息:该应用程序称为接口   为不同的线程编组。 (HRESULT的例外情况:0x8001010E   (RPC_E_WRONG_THREAD))

我的代码:

 public async void LoadActivities()
    {
        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;

        StorageFolder activityFolder = await storageFolder.CreateFolderAsync(App.AppSettings.ActivityDirectory, CreationCollisionOption.OpenIfExists);

        IReadOnlyList<StorageFolder> groupFolders = await activityFolder.GetFoldersAsync();

        ObservableCollection<ActivityDataGroup> groups = new ObservableCollection<ActivityDataGroup>();

        foreach (var groupFolder in groupFolders)
        {
            ActivityDataGroup group = new ActivityDataGroup();
            group.GroupName = groupFolder.Name;

            ICollection<ActivityViewModel>  activities = await GetStoredActivitiesInFolder(groupFolder);

            foreach (var activity in activities)
            {
                group.Items.Add(activity);
            }

            AllGroups.Add(group);

        }

        this.IsDataLoaded = true;
    }

3 个答案:

答案 0 :(得分:0)

我认为你的GetStoredActivitiesInFolder可能会在非UI线程上返回,然后你可以修改它,使它不会或做这样的事情,以确保你更新UI线程上的视图绑定项,例如那样:

await Dispatcher.RunAsync(
    CoreDispatcherPriority.High,
    () =>
    {
        AllGroups.Add(group);
    };

答案 1 :(得分:0)

答案 2 :(得分:0)

以上都没有,但我随机发现了它。 LoadActivities函数在页面的构造函数中调用。当我将它移动到OnLaunched方法时,它神奇地起作用。我不知道为什么,但确实如此。 =)

无论如何,谢谢你的帮助,很抱歉打扰。