【发布时间】:2018-01-09 04:18:42
【问题描述】:
我正在尝试将 async/await 引入一个新的代码库,让它每 x 秒执行一次后台任务。
我有以下内容,但它只是永远停止而没有运行操作 (printStuff)。
using System;
using System.Threading.Tasks;
namespace ASyncTaskDemo
{
class Program3
{
public static void Main(string[] args)
{
Action action = printStuff;
ExecuteEvery(new Task(action), 5000).Wait();
//simulate the rest of the application stalling until shutdown events.
Console.ReadLine();
}
private static int x = 0;
private static void printStuff()
{
Console.Error.Write(x++);
}
private static async Task ExecuteEvery(Task execute, int milliseconds)
{
while (true)
{
var delay = Task.Delay(milliseconds);
await Task.WhenAll(delay, execute);
}
}
}
}
如何确保任务在正确的线程上运行,甚至完全运行?
execute 预计是一个运行时间较长的数据库摘要查询。 毫秒预计在秒到分钟的范围内,并且希望计时准确。
“正确线程”是指任务应该在异步/网络环境中执行,而不是与主程序调度同步。
但是,如果此代码可重用,则有时可能适合在 UI 线程或服务器线程中运行任务,如果能解释一下是什么线程以及如何配置它,我将不胜感激。
【问题讨论】:
-
“在正确的线程上运行”是什么意思?能详细解释一下吗
-
我添加了一个编辑澄清。
-
如果你的
Action将是一个纯async调用,即i/o调用而不是一个cpu 绑定的调用,那么你不应该使用@ 987654325@,对db provider api等使用异步方法 -
在匿名化和缩小示例时可能会丢失一些东西。
标签: c# async-await