C# 如何放置异步任务<;列表<&燃气轮机&燃气轮机;进入BindableCollection<&燃气轮机;
如何等待任务并返回其结果,并将任务的结果放入BindableCollection。 (return await Task.Run())的语法有问题,无法将其放入BindableCollection。 基本上,我要做的是等待方法的结果,返回它并将其放入ViewModel中的BindableCollection中,然后绑定到ItemsControl。 我在多线程中查找了一些示例,不幸的是,没有一个线程包含任何关于BindableCollection的内容。 我只能猜测我必须以某种方式将泛型列表转换为IEnumerable,尽管我不知道如何转换C# 如何放置异步任务<;列表<&燃气轮机&燃气轮机;进入BindableCollection<&燃气轮机;,c#,wpf,C#,Wpf,如何等待任务并返回其结果,并将任务的结果放入BindableCollection。 (return await Task.Run())的语法有问题,无法将其放入BindableCollection。 基本上,我要做的是等待方法的结果,返回它并将其放入ViewModel中的BindableCollection中,然后绑定到ItemsControl。 我在多线程中查找了一些示例,不幸的是,没有一个线程包含任何关于BindableCollection的内容。 我只能猜测我必须以某种方式将泛型列表转换为
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
}
}
公共类数据访问:导体
{
公共异步任务启动程序(IProgress progress,CancellationToken CancellationToken)
{
列表输出=新列表();
//到目前为止我试过什么
返回等待扫描同步(进度、取消令牌);
列表>输出=等待扫描同步(进度、取消令牌);
}
专用静态异步任务扫描同步(IProgress progress,CancellationToken cs)
{
等待任务。运行(()=>
{
做事
}).配置等待(true);
等待任务。运行(()=>
{
完成任务并返回输出。
}).配置等待(true);
}
}
公共类视图模型:导体
{
私有BindableCollection数据{get;set;}
私有CancellationTokenSource cts=新的CancellationTokenSource();
私有进度=新进度();
公共无效StartScan()
{
DataAccess da=新的DataAccess();
数据=新的BindableCollection(da.Starter(progress,cts.Token));
//错误:无法从Tasks.Task转换为Generic.IEnumerable
}
}
您的代码试图将任务转换为BindableCollection,您可能希望将任务的结果转换为BindableCollection,为此,您需要等待da。开始调用:
Data = new BindableCollection<DataModel>(await da.Starter(progress, cts.Token));
您的代码尝试将任务转换为BindableCollection,您可能希望转换任务的结果,为此,您需要等待da.Start方法:Data=new BindableCollection(wait da.Starter(progress,cts.Token));您可能需要将StartScan方法的签名调整为公开异步任务StartScanThanks!我设法做到了。我不知道我已经接近正确答案了。只需额外连接InotifyProperty更改,瞧,太棒了!如果我把它放在那里,你介意接受这个评论作为回答吗?结束这个问题?是的,当然,我在找那个tbh
public async Task StartScan()