【发布时间】: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