【发布时间】:2019-02-10 21:28:57
【问题描述】:
我有一个异步函数并使用了 Progress
进行长进程在我运行另一个任务后,似乎许多进度报告正在运行。
private async void Listbox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var progress = new Progress<int>(percent =>
{
prg.Value = percent;
});
isCanceled = true;
await ExecuteManuallyCancellableTaskAsync(progress);
}
这是我的功能
public async Task ExecuteManuallyCancellableTaskAsync(IProgress<int> progress)
{
var mprogress = 0;
prg.Value = 0;
using (var cancellationTokenSource = new CancellationTokenSource())
{
cancellationTokenSource.Cancel();
var SearchTask = Task.Run(async () =>
{
foreach (var file in await GetFileListAsync(GlobalData.Config.DataPath))
{
if (isCanceled)
{
cancellationTokenSource.Cancel();
return;
}
mprogress += 1;
progress.Report((mprogress * 100 / TotalItem));
await Dispatcher.InvokeAsync(() =>
{
// my codes
}, DispatcherPriority.Background);
}
});
await SearchTask;
}
}
【问题讨论】:
-
你在哪里使用
cancellationTokenSource.Token? ...还有你在哪里将isCanceled设置为假? -
@Selvin isCanceled 是布尔值,当我运行我的 func 时,我将其设置为 true,在 func 中我检查是否为 true,我调用了 cancelTokenSource.Cancel();我没有令牌
-
我假设在您的代码中某处您也设置了“isCanceled = false;”。这是正确的吗?
-
你永远不会使用
cancellationTokenSource,所以这样做cancellationTokenSource.Cancel()实际上什么都不做......即使isCanceled在遇到true时没有设置为true,在其他情况下它会在至少离开foreach循环 -
@Selvin 我该如何解决这个问题?
标签: c# wpf asynchronous async-await progress