- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在数组中有一系列任务。如果 Task 是“Good”,它会返回一个字符串。如果它是“坏”:它返回一个空值。
我希望能够并行运行所有任务,一旦第一个返回“好”,然后取消其他任务并获得“好”结果。
我现在正在这样做,但问题是所有任务都需要运行,然后我循环遍历它们以寻找第一个好的结果。
List<Task<string>> tasks = new List<Task<string>>();
Task.WaitAll(tasks.ToArray());
最佳答案
I want to be able to run all the Tasks in parallel, and once the first one comes back that is "Good", then cancel the others and get the "Good" result.
这是误解,因为Cancellation in TPL is co-operative ,因此一旦任务启动,就无法取消它。 CancellationToken
可以在任务启动之前或之后抛出异常,如果请求取消,这意味着启动并采取必要的行动,比如从逻辑中抛出自定义异常
检查以下 query ,它列出了许多有趣的答案,但没有一个被取消。以下也是一个可能的选择:
public static class TaskExtension<T>
{
public static async Task<T> FirstSuccess(IEnumerable<Task<T>> tasks, T goodResult)
{
// Create a List<Task<T>>
var taskList = new List<Task<T>>(tasks);
// Placeholder for the First Completed Task
Task<T> firstCompleted = default(Task<T>);
// Looping till the Tasks are available in the List
while (taskList.Count > 0)
{
// Fetch first completed Task
var currentCompleted = await Task.WhenAny(taskList);
// Compare Condition
if (currentCompleted.Status == TaskStatus.RanToCompletion
&& currentCompleted.Result.Equals(goodResult))
{
// Assign Task and Clear List
firstCompleted = currentCompleted;
break;
}
else
// Remove the Current Task
taskList.Remove(currentCompleted);
}
return (firstCompleted != default(Task<T>)) ? firstCompleted.Result : default(T);
}
}
var t1 = new Task<string>(()=>"bad");
var t2 = new Task<string>(()=>"bad");
var t3 = new Task<string>(()=>"good");
var t4 = new Task<string>(()=>"good");
var taskArray = new []{t1,t2,t3,t4};
foreach(var tt in taskArray)
tt.Start();
var finalTask = TaskExtension<string>.FirstSuccess(taskArray,"good");
Console.WriteLine(finalTask.Result);
您甚至可以返回 Task<Task<T>>
, 而不是 Task<T>
进行必要的逻辑处理
关于c# - Task.WaitAny() — 检查结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52103987/
我在数组中有一系列任务。如果 Task 是“Good”,它会返回一个字符串。如果它是“坏”:它返回一个空值。 我希望能够并行运行所有任务,一旦第一个返回“好”,然后取消其他任务并获得“好”结果。 我现
目前我正在尝试制作一个策划者类型的代码,就像游戏一样。我目前停留在尝试检查用户猜测是否正确的位置。 colours = ["R","O","Y","G","B","I","V"] n = 1 ans
我注意到在检查字典中的值是否为 nil 时,我发现了一种令人困惑的行为。在某个通知的通知处理程序中,我想检查错误键的值是否为零。在尝试调试时,我尝试了以下操作: po userInfo["error"
不可预测(不明显)nil检查: 这个函数: fileprivate func isPurchased(_ name: String) -> Bool { if let _ = dict
我正在从 HTML 页面获取所有 url 链接,并调用一个函数来发送所有 url 链接的 XHR 请求。我想以正确的方式控制台记录那些通过和失败的请求链接。我在某种程度上得到了结果,但对控制台日志/错
我遇到的情况是,我有 Arraylist,其中包含名称项。我需要循环遍历该名单,检查用户给出的新名称是否已在列表中。如果是,只需给 toast 通知用户该名称已经存在,或者如果不存在,则将名称添加到列
这是我第一次编码,所以请原谅我的无知。 我有以下 Selenium 代码,用于从餐厅在线订购。最后,它将一个值放入一个字段中,检查并打印结果,然后我需要做的是更改原始输入,然后再做一次。所以我需要一个
使用此向导插件:jQuery Formwizard Plugin 问题是表单提交使用的是 Ajax。我需要将它提交到指定的 url(例如 test.php),然后向导需要检查返回值(例如:error、
我是一名优秀的程序员,十分优秀!