如何在c#中运行多个任务并在完成这些任务时获取事件?

Yas*_*ser 10 c# task

Task当它完成时我正在重新运行.下面是我在Application_Start我的应用程序中调用的函数.

private void Run()
{
    Task t = new Task(() => new XyzServices().ProcessXyz());
    t.Start();
    t.ContinueWith((x) =>
    {
        Thread.Sleep(ConfigReader.CronReRunTimeInSeconds);
        Run();
    });
}
Run Code Online (Sandbox Code Playgroud)

我想运行多个任务,编号将从web.config app setttings中读取.

我正在尝试这样的事情,

private void Run()
{
    List<Task> tasks = new List<Task>();
    for (int i = 0; i < ConfigReader.ThreadCount - 1; i++)
    {
        tasks.Add(Task.Run(() => new XyzServices().ProcessXyz()));
    }

    Task.WhenAll(tasks);

    Run();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Mar*_*sen 13

我相信你在寻找:

Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)

https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

  • @Yasser,这将有效,但您应该使用`Task.WhenAll`,查找它. (2认同)

Jod*_*ell 9

如果你想一个接一个地运行任务,

await Task.Run(() => new XyzServices().ProcessXyz());
await Task.Delay(ConfigReader.CronReRunTimeInSeconds * 1000);
Run Code Online (Sandbox Code Playgroud)

如果你想同时运行它们,就像任务调度程序允许的那样,

await Task.WhenAll(new[]
    {
        Task.Run(() => new XyzServices().ProcessXyz()),
        Task.Run(() => new XyzServices().ProcessXyz())
    });
Run Code Online (Sandbox Code Playgroud)

所以,你的方法应该是这样的,

private async Task Run()
{
    var tasks =
        Enumerable.Range(0, ConfigReader.ThreadCount)
        .Select(i => Task.Run(() => new XyzServices().ProcessXyz()));

    await Task.WhenAll(tasks); 
}
Run Code Online (Sandbox Code Playgroud)