System.Threading.Task等待疑问

发布于 2024-10-29 13:39:40 字数 876 浏览 0 评论 0原文

如果我使用 System.Threading.Task 运行这样的并行任务:

Func<MyResult> func=ComputeResult;

var t = Task.Facroty.StartNew<MyResult>(ComputeResult, 1);//1 is some id
t.Wait();
var tt = Task.Facroty.StartNew<MyResult>(ComputeResult, 2);
tt.Wait();

将阻止下一个语句。

如果我在循环中启动几个任务,并希望以循环内的任务不会互相阻塞但循环后的语句被阻塞的方式等待所有任务。

我正在使用以下构造:

var tasks=new List<Task<MyResult>>();

Func<MyResult> func=ComputeResult;

for(int i=0; i<10;i++)
{
    var t=Task.Facroty.StartNew<MyResult>(ComputeResult, i);
    tasks.Add(t);
    //t.Wait(); //SHOULD I CALL WAIT HERE?
}

 //OR THIS BETTER OR EVEN IF THIS WORKS
 foreach(var t in tasks)
 {
      t.Wait();
 }

 //do other stuff

编辑:- 在最终形式中,我使用以下行而不是最后一个 foreach 循环。

 Task.WaitAll(tasks.ToArray());

If I am using System.Threading.Task to run parallel tasks like this:

Func<MyResult> func=ComputeResult;

var t = Task.Facroty.StartNew<MyResult>(ComputeResult, 1);//1 is some id
t.Wait();
var tt = Task.Facroty.StartNew<MyResult>(ComputeResult, 2);
tt.Wait();

Will t.Wait() block next statement.

If I am starting few tasks in a loop and want to wait for them all in such a way that tasks inside loop don't block eachother but statement after loop is blocked.

I am using following construct:

var tasks=new List<Task<MyResult>>();

Func<MyResult> func=ComputeResult;

for(int i=0; i<10;i++)
{
    var t=Task.Facroty.StartNew<MyResult>(ComputeResult, i);
    tasks.Add(t);
    //t.Wait(); //SHOULD I CALL WAIT HERE?
}

 //OR THIS BETTER OR EVEN IF THIS WORKS
 foreach(var t in tasks)
 {
      t.Wait();
 }

 //do other stuff

EDIT:- In final form I am using following line instead of last foreach loop.

 Task.WaitAll(tasks.ToArray());

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

枯叶蝶 2024-11-05 13:39:40

怎么样:

Task.WaitAll(
    Enumerable
        .Range(1, 10)
        .Select(x => Task.Factory.StartNew(arg => 
        {
            // Do the task here
            // arg will obviously be the state object x
            // which will range from 1 to 10
        }, x))
        .ToArray()
);

How about:

Task.WaitAll(
    Enumerable
        .Range(1, 10)
        .Select(x => Task.Factory.StartNew(arg => 
        {
            // Do the task here
            // arg will obviously be the state object x
            // which will range from 1 to 10
        }, x))
        .ToArray()
);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文