首页 > 解决方案 > 我怎样才能把异步任务> 进入 BindableCollection<>

问题描述

我如何等待Task并返回其结果并将Task的结果放入BindableCollection。(return await Task.Run()) 的语法有问题,并将其放入 BindableCollection。基本上,我正在尝试做的是等待方法的结果,将其返回并将其放入 ViewModel 中的 BindableCollection 并绑定到 ItemsControl。我在多个线程中查找了一些示例,不幸的是,没有一个线程包含有关 BindableCollection 的任何内容。我只能猜测我必须以某种方式将通用列表转换为 IEnumerable,尽管我不知道如何。

public class DataAccess : Conductor<object>
{
    public async Task<List<DataModel>> Starter(IProgress<ProgressReportModel> progress, CancellationToken cancellationToken)
    {
        List<DataModel> output = new List<DataModel>();

        //What i tried so far
        return await ScannerAsync(progress, cancellationToken);
        List<GameDataModel>> output = await ScannerAsync(progress, cancellationToken);
    }

    private static async Task<List<DataModel>> ScannerAsync(IProgress<ProgressReportModel> progress, CancellationToken cs)
    {
         await Task.Run(() =>
        {
            Do Stuff

        }).ConfigureAwait(true);

         await Task.Run(() =>
        { 
            Do Stuff and return output.
        }).ConfigureAwait(true);
    }
}

public class ViewModel : Conductor<object>
{
   private BindableCollection<DataModel> Data { get; set; }
   private CancellationTokenSource cts = new CancellationTokenSource();
   private Progress<ProgressReportModel> progress = new Progress<ProgressReportModel>();

   public void StartScan()
   {
      DataAccess da = new DataAccess();
      Data = new BindableCollection<DataModel>(da.Starter(progress, cts.Token));
      // ERROR: Cannot Convert from Tasks.Task to Generic.IEnumerable
   }
}

标签: c#wpf

解决方案


您的代码尝试将 Task 转换为 BindableCollection,您希望转换任务的 RESULT,为此您需要等待 da.Start 调用:

Data = new BindableCollection<DataModel>(await da.Starter(progress, cts.Token));

您可能需要调整 StartScan 方法的签名以

public async Task StartScan()

推荐阅读