我一直在研究(包括查看所有其他与此主题相关的SO帖子)最佳方法来实现一个(很可能是)Windows服务工作者,该工作者将从数据库中提取工作项,并以异步并行方式在后台“忘记即可”处理它们(工作项管理将在异步方法中处理)。 工作项将是Web服务调用和数据库查询。 生产这些工作项的生产者将应用一定的限流措施,以确保某种度量的工作安排方法。 以下示例非常基本,仅用于突出while循环和for循环的逻辑。哪种方法更理想或是否无关紧要? 是否有更合适/更高效的方法来实现这一点?
async / await ...
async / await ...
private static int counter = 1;
static void Main(string[] args)
{
Console.Title = "Async";
Task.Run(() => AsyncMain());
Console.ReadLine();
}
private static async void AsyncMain()
{
while (true)
{
// Imagine calling a database to get some work items to do, in this case 5 dummy items
for (int i = 0; i < 5; i++)
{
var x = DoSomethingAsync(counter.ToString());
counter++;
Thread.Sleep(50);
}
Thread.Sleep(1000);
}
}
private static async Task<string> DoSomethingAsync(string jobNumber)
{
try
{
// Simulated mostly IO work - some could be long running
await Task.Delay(5000);
Console.WriteLine(jobNumber);
}
catch (Exception ex)
{
LogException(ex);
}
Log("job {0} has completed", jobNumber);
return "fire and forget so not really interested";
}
Task.Run...
private static int counter = 1;
static void Main(string[] args)
{
Console.Title = "Task";
while (true)
{
// Imagine calling a database to get some work items to do, in this case 5 dummy items
for (int i = 0; i < 5; i++)
{
var x = Task.Run(() => { DoSomethingAsync(counter.ToString()); });
counter++;
Thread.Sleep(50);
}
Thread.Sleep(1000);
}
}
private static string DoSomethingAsync(string jobNumber)
{
try
{
// Simulated mostly IO work - some could be long running
Task.Delay(5000);
Console.WriteLine(jobNumber);
}
catch (Exception ex)
{
LogException(ex);
}
Log("job {0} has completed", jobNumber);
return "fire and forget so not really interested";
}
async void
;除非有异步操作,否则不要使用 async;不要在没有等待它们的情况下运行异步任务。 - SLaksTask.Run
,但是你的问题表述不够清楚。 - SLaksTask.Run
方法。很容易使用SemaphoreSlim
进行限流,就像这样,或者您甚至可以使用TPL Dataflow来实现更好的效果。 - noseratio - open to work