如何在 C# 中 运行 多个任务并在完成这些任务时获取事件?
How to run multiple tasks in c# and get an event on complete of these tasks?
我正在 运行 重新 Task
完成后。下面是我在应用程序的 Application_Start
中调用的函数。
private void Run()
{
Task t = new Task(() => new XyzServices().ProcessXyz());
t.Start();
t.ContinueWith((x) =>
{
Thread.Sleep(ConfigReader.CronReRunTimeInSeconds);
Run();
});
}
我想要 运行 多个任务,将从 web.config 应用程序设置中读取的编号。
我正在尝试这样的事情,
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();
}
执行此操作的正确方法是什么?
我相信您正在寻找:
Task.WaitAll(tasks.ToArray());
https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx
如果您想等待所有任务完成然后重新启动它们,Marks 的回答是正确的。
但是如果你想让ThreadCount个任务在任何时候都是运行(其中任何一个任务结束后立即开始一个新任务),那么
void Run()
{
SemaphoreSlim sem = new SemaphoreSlim(ConfigReader.ThreadCount);
Task.Run(() =>
{
while (true)
{
sem.Wait();
Task.Run(() => { /*Your work*/ })
.ContinueWith((t) => { sem.Release(); });
}
});
}
如果你想运行一个接一个地完成任务,
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);
}
我正在 运行 重新 Task
完成后。下面是我在应用程序的 Application_Start
中调用的函数。
private void Run()
{
Task t = new Task(() => new XyzServices().ProcessXyz());
t.Start();
t.ContinueWith((x) =>
{
Thread.Sleep(ConfigReader.CronReRunTimeInSeconds);
Run();
});
}
我想要 运行 多个任务,将从 web.config 应用程序设置中读取的编号。
我正在尝试这样的事情,
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();
}
执行此操作的正确方法是什么?
我相信您正在寻找:
Task.WaitAll(tasks.ToArray());
https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx
如果您想等待所有任务完成然后重新启动它们,Marks 的回答是正确的。
但是如果你想让ThreadCount个任务在任何时候都是运行(其中任何一个任务结束后立即开始一个新任务),那么
void Run()
{
SemaphoreSlim sem = new SemaphoreSlim(ConfigReader.ThreadCount);
Task.Run(() =>
{
while (true)
{
sem.Wait();
Task.Run(() => { /*Your work*/ })
.ContinueWith((t) => { sem.Release(); });
}
});
}
如果你想运行一个接一个地完成任务,
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);
}