如何在 ThreadStart 中使用“StartService”任务?
Posted
技术标签:
【中文标题】如何在 ThreadStart 中使用“StartService”任务?【英文标题】:How do I use "StartService" Task with ThreadStart? 【发布时间】:2021-09-19 16:40:07 【问题描述】:有可能吗?
public partial class MyService : ServiceBase
public MyService()
InitializeComponent();
LocalInit();
internal void LocalInit()
//place here any local checks
protected override void OnStart(string[] args)
if (Something.ConfigOK())
ThreadStart threadDelegate = Something.StartService; // Expected a method with void StartService signature
var newThread = new Thread(threadDelegate);
newThread.Start();
else
//log error
throw new Exception("MyService : Config failed");
public static partial class Something
public static async Task StartService()
await DoJob();
错误
Error CS0407 'Task Something.StartService()' has the wrong return type
Expected a method with void StartService signature
【问题讨论】:
Thread
构造函数不理解异步委托。你可以阅读这个here 或here。为什么要启动Thread
,而不是直接在OnStart
方法内部调用异步方法DoJob
?
附带说明,根据guidelines,异步方法应该有一个Async
后缀。 StartServiceAsync
和 DoJobAsync
是正确的。
【参考方案1】:
你试过了吗?
protected override void OnStart(string[] args)
if (Something.ConfigOK())
Something.StartService();
else
//log error
throw new Exception("MyService : Config failed");
如果DoJob
os 真正异步或者:
protected override void OnStart(string[] args)
if (Something.ConfigOK())
Task.Run(Something.StartService);
else
//log error
throw new Exception("MyService : Config failed");
如果不是(阻塞)。
无需显式创建线程。
小心异常处理!
但是,既然您提到了 ASP.NET Core (???),我建议您使用 Worker template。
【讨论】:
【参考方案2】:有可能,但我建议您使用Background tasks with hosted services。 这是一些implementation
或使用hangfire 队列。
正如我所提到的,这是一个建议,而不是您问题的答案。
【讨论】:
以上是关于如何在 ThreadStart 中使用“StartService”任务?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ThreadStart 中使用“StartService”任务?
c# 中new ThreadStart()怎么用?这里面怎么传参数?
如何将参数传递给 Thread 中的 ThreadStart 方法?