如何在 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 后缀。 StartServiceAsyncDoJobAsync 是正确的。 【参考方案1】:

你试过了吗?

protected override void OnStart(string[] args)

    if (Something.ConfigOK())
    
        Something.StartService();
    
    else
    
        //log error
        throw new Exception("MyService : Config failed");
    

如果DoJobos 真正异步或者:

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()怎么用?这里面怎么传参数?

new ThreadStart中的方法如果有参数,该怎么写

如何将参数传递给 Thread 中的 ThreadStart 方法?

C#多线程委托ParameterizedThreadStart应用

线程的start和run方法的区别