【问题标题】:Start async method in new thread - No overload在新线程中启动异步方法 - 无重载
【发布时间】:2023-02-15 23:34:38
【问题描述】:

我在课堂上有这些方法

    public async Task GetCompanies(int requestDuration, long startTimepoint)
    {
        _requestDuration = requestDuration;
        _startTimepoint = startTimepoint;

        Thread thread = new Thread(new ThreadStart(Test));

        // This line doesnt compile - No overload for GetCompaniesApi matches delegate ThreadStart
        Thread thread2 = new Thread(new ThreadStart(GetCompaniesApi));
    }

    public void Test()
    {
    }

    public async Task GetCompaniesApi (int requestDuration, long? startTimepoint)
    {
        // code removed as not relevant
    }

所以我的问题是如何在不同的线程中运行异步方法,我真的不知道“GetCompaniesApi 的重载不匹配委托 ThreadStart”是什么意思,或者我需要更改什么。

【问题讨论】:

  • 直接管理线程有什么特别的原因吗?

标签: c# multithreading .net-7.0


【解决方案1】:

ThreadStart 是代表无参数方法的委托,返回值是void(所以它不是异步感知的),所以从纯技术的角度来看,你可以做类似new ThreadStart(() =>GetCompaniesApi(1,2)) 的事情。但你不应该。在现代 .NET 中很少需要直接创建线程,只需使用 Task.Run 在线程池上安排异步方法(不要忘记提供参数):

await Task.Run(() => Test());

对于 async 方法 - 只需调用它:

var result = await GetCompaniesApi(someInt, someNullableLong);

如果由于某种原因它实际上不是异步的,那么最好修复方法本身,但如果需要,您也可以将其包装到 Task.Run 中。

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 2018-03-27
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多