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

本文关键字:任务 完成时 事件 一个 运行 | 更新日期: 2023-09-27 18:05:12

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

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

我想运行多个任务,将从web读取的数字。配置应用设置

我正在尝试这样做,

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();
}

正确的方法是什么

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

我相信你要找的是:

Task.WaitAll(tasks.ToArray());

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

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

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

如果您想并发地运行它们,在任务调度程序允许的情况下,

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

你的方法应该是这样的

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

如果您想等待所有任务完成后再重新启动,那么Marks的答案是正确的。

但是如果你想要ThreadCount任务在任何时候都在运行(只要其中任何一个任务结束就启动一个新任务),那么

void Run()
{
    SemaphoreSlim sem = new SemaphoreSlim(ConfigReader.ThreadCount);
    Task.Run(() =>
    {
        while (true)
        {
            sem.Wait();
            Task.Run(() => { /*Your work*/  })
                .ContinueWith((t) => { sem.Release(); });
        }
    });
}