代码之家  ›  专栏  ›  技术社区  ›  developer82

C编写一个异步方法,其中没有等待

  •  -1
  • developer82  · 技术社区  · 5 年前

    我想要一个 async 调用中的方法,该方法将由我的库使用者使用 await . 但是我的方法的内部工作,虽然我需要它在一个单独的线程上运行,但不调用任何其他线程 等待 它自己的。

    我只是做了这个方法应该做的工作并返回类型。编译器警告我这个方法不会以异步方式运行。

    public async Task<MyResultObject> DoSomeWork()
    {
         MyResultObject result = new MyResultObject();
         // Some work to be done here
    
         return result;
    }
    

    另一方面,如果我编写了一个方法,它使用这样的taskfactory启动一个新任务:

    public Task<MyResultObject> DoSomeWork()
    {
         return Task<MyResultObject>.Factory.StartNew(() =>
         {
             MyResultObject result = new MyResultObject();
             // Some work to be done here
    
             return result;
         });
    }
    

    那我就不能用 等待 像这样的关键词 await DoSomeWork() .

    我怎么写 异步的 (必须是异步的,而不是带有结果或等待的任务)而不使用 等待 打电话到里面?

    1 回复  |  直到 5 年前
        1
  •  0
  •   bommelding    5 年前

    你可以做到这一点

    public Task<MyResultObject> DoSomeWork()
    {
         MyResultObject result = new MyResultObject();
         // Some work to be done here
    
         return Task.FromResult(result);
    }
    

    这和

    public async Task<MyResultObject> DoSomeWork()
    {
         MyResultObject result = new MyResultObject();
         // Some work to be done here
    
         return result;
    }
    

    只有这个版本提供了一个警告,并且开销稍微大一些。

    但两者都不会在另一个线程上运行。唯一的好处是它们有一个可等待的接口。

    要并行执行,代码可以,但task.run优先于startnew():

    public Task<MyResultObject> DoSomeWork()
    {
         return Task.Run(() =>
         {
             MyResultObject result = new MyResultObject();
             // Some work to be done here
    
             return result;
         });
    }
    

    在所有这些情况下,你绝对可以 await DoSomeWork()