【问题标题】:How can i put async Task<List<>> into a BindableCollection<>如何将异步 Task<List<>> 放入 BindableCollection<>
【发布时间】:2020-01-30 01:29:04
【问题描述】:

如何等待 Task 并返回它的 result 并将 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
   }
}

【问题讨论】:

  • 您的代码尝试将 Task 转换为 BindableCollection,您想要转换任务的 RESULT,为此您需要等待 da.Start 方法:Data = new BindableCollection(等待 da.Starter(progress, cts.Token));您可能需要调整 StartScan 方法的签名以公开异步任务 StartScan
  • 非常感谢!我设法做到了。我不知道我接近正确答案。只需要另外连接 INotifyPropertyChanged 就可以了。
  • 太棒了!如果我把它放在那里,你介意接受评论作为答案吗?结束这个问题?
  • 是的,当然,我正在寻找那个 tbh

标签: c# wpf


【解决方案1】:

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

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

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

public async Task StartScan()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多