gpt4 book ai didi

c# - 如何安排有条件的 ContinueWith

转载 作者:可可西里 更新时间:2023-11-01 08:43:07 28 4
gpt4 key购买 nike

我在一堆 LINQ 查询上有一些 GUI。查询需要一些时间来执行,所以我希望 GUI 能够响应并显示繁忙指示器和进度条。许多查询是为了检查数据中存在的某些条件。如果查询返回空结果,应用程序应继续下一个查询。如果它返回结果,则返回集的严重性将是“警告”或“错误”。如果是警告,则继续执行。如果出错,则停止。

许多代码与线程池和 GUI 玩“乒乓球”。准代码:

TaskFactory.StartNew(()=>
{
Run in background
}.ContinueInGui(()=>
{
Update something
}).ContinueInBackground(()=>
{
Do more work;
}).ContinueInGui(()=> etc etc

这很整洁,很好。但是,如果在数据中发现错误,我看不到如何插入条件以采用不同的延续路线或中断延续链。

ContinueWithIf( predicate ,delegate{},TaskScheduler) 没有方法我是否使用 TaskCancellation,是否抛出异常?还是有一些我没有想到的简单分支机制?

最佳答案

这里一个不错的选择是使用 CancelationTokenSource ,如果您想“打破”您的延续链,只需将其标记为已取消。通过包括 TaskContinuationOptions.NotOnCanceledContinueWith对于后续任务,您可以通过标记 CancelationTokenSource 让它们在任何时候都不被安排。已取消。

如果您真的想使用谓词,而不是在 main 方法中设置延续,您需要创建一个自定义方法来为您处理这个问题。这可以通过使用附加延续的扩展方法来完成——延续可以检查谓词,并在适当时触发延续。这看起来像:

public static Task ContinueWithIf(this Task task, Func<bool> predicate, Action<Task> continuation, TaskScheduler scheduler)
{
var tcs = new TaskCompletionSource<object>();

task.ContinueWith( t =>
{
if (predicate())
{
new TaskFactory(scheduler).StartNew(
() =>
{
continuation(task);
tcs.SetResult(null);
});
}
else
{
tcs.TrySetCanceled();
}
});

return tcs.Task;
}

当然,您可能想要为 Task<T> 制作一个版本此外,还要处理任务的故障/取消状态。话虽如此,它应该可以正常运行。

关于c# - 如何安排有条件的 ContinueWith,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7872860/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com