【发布时间】:2016-05-11 17:30:50
【问题描述】:
我一直在研究(包括查看有关该主题的所有其他 SO 帖子)实现(最有可能的)Windows 服务工作者的最佳方法,该服务工作者将从数据库中提取工作项并在 ' 中异步并行处理它们后台的“即发即弃”方式(工作项管理将全部以异步方式处理)。工作项将是 Web 服务调用和数据库查询。将对这些工作项的生产者施加一些限制,以确保采用某种可衡量的方法来安排工作。下面的示例非常基础,只是为了突出 while 循环和 for 循环的逻辑。哪个是理想的方法,还是无关紧要?有没有更合适/更有效的方式来实现这一目标?
异步/等待...
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";
}
任务.运行...
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;除非您确实有异步操作,否则不要使用异步,不要在没有等待的情况下运行异步操作。 -
你需要学习异步的基础知识。阅读msdn.microsoft.com/en-us/magazine/jj991977.aspx
-
@SLaks -> 那么你将如何在一个进程中并行执行多个任务呢?
-
使用并行 LINQ。
-
@user2231663,我会坚持使用
Task.Run方法。使用SemaphoreSlim(如this)很容易进行节流,或者使用 TPL 数据流可能会更好。
标签: c# .net asynchronous async-await task-parallel-library