c# - 创建一个返回 Task<List<MyDataObject>> foo() 的方法

标签 c# task-parallel-library

我可以在 .Net 4.5 中解决这个问题,但我必须在 .Net 4.0 中解决它,到目前为止我还没有成功。 我无法将回复发送到 Task<List<MyDataObject>> .下面的代码可以创建List<MyDataObject> .

public Task<List<MyDataObject>> Foo()
{
     IEnumerable<string> names = GetList();
     var tasks = new List<Task>();
     foreach (var name in names)
     {               tasks.Add(Task<MyDataObject>.Factory.StartNew(
               () =>
               {
                    var reply = new MyDataObject();
                    var workerObject = new WorkerObject();
                    workerObject.Foo2();
                    reply.Success = true;
                    return reply;
                }));
       }

       Task.WaitAll(tasks.ToArray());
       var replyList = new List<MyDataObject>();
       for (int i = 0; i < tasks.Count(); i++)
       {     replyList.Add(((Task<MyDataObject>)tasks[i]).Result);
        }

        return replyList;
}

WhenAll()只有4.5

await只有4.5

所以我不能接受那些

我同意这不会编译。我展示的是我可以遍历结果。但是我不知道怎么走

List<MyDataObject>()

Task<List<MyDataObject>>

感谢您的回复。我将接受 Yuval Itzchakov 的回答,因为它以简单的方式解决了我的问题。对于这个用例,我仅限于没有新的程序集。如果我有另一种方法需要此功能,我会选择 280Z28 的第二个选项。

最佳答案

使用 TaskCompletionSource<List<MyDataObject>>

Task.WaitAll(tasks.ToArray());

var replyList = new List<MyDataObject>();

for (int i = 0; i < tasks.Count(); i++)
{                
    replyList.Add(((Task<MyDataObject>)tasks[i]).Result);
}

var tcs = new TaskCompletionSource<List<MyDataObject>>();
tcs.SetResult(replyList);
return tcs.Task;

您还可以下载 Microsoft.Bcl.Async 得到 .NET 4.0 中的 NET 4.5 效果

关于c# - 创建一个返回 Task<List<MyDataObject>> foo() 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124514/

相关文章:

C# 如何为 selectedValue = null 设置 dropDownList 默认值

c# - 在任务中进行异步/等待数据库调用?

c# - System.Threading.Task 什么时候有用?

c# - 使用 TPL 数据流在预定义 block 之上创建可重用的处理逻辑?

c# - 同步执行多个任务

c# - 如何防止 UserControl 的使用者看到该控件的子控件?

c# - 如何在 C# 中的 NHibernate 的 QueryOver 中使用 Oracle 的内置关键字或函数?

c# - 如何等到任务在 C# 中完成?

c# - 了解事务范围超时

c# - 通过 Options 类或 DesiredCapability 禁用 IE 弹出窗口拦截器