如何将void同步方法转换为异步方法?

avhhh

所以我有只同步操作的此方法:

public void Foo(){
    //do something synchronously
    if(x == 0)
        return;
    else if(x < 5):
        //do something
        return;
    // do something extra
}

由于某些接口的更改,尽管没有异步操作,该方法也必须更改为异步方法。为了拥有async关键字,await其主体内必须有一个关键字。原始同步方法的等效方法是:

public async Task FooAsync(){
    //do something synchronously
    if(x == 0)
        await Task.CompletedTask;
    else if(x < 5):
        //do something
        await Task.CompletedTask;
    // do something extra
}

我不确定这一点,因为该CompletedTask属性表明它是成功的操作,并非所有这些条件条件都如此。

编辑:在评论中解决。仅仅因为方法以“异步”后缀表示,并不意味着它需要async修饰符。该函数将如下所示编写以遵守界面更改:

public Task FooAsync(){
    //do something synchronously
    if(x == 0)
        return Task.CompletedTask;
    else if(x < 5):
        //do something
        return Task.CompletedTask;
    // do something extra
    return Task.CompletedTask;
}
斯蒂芬·克莱里

正如其他人所指出的,类似任务的返回类型是异步签名,而是async异步实现细节完全有可能没有一个Task-returning方法async

但是,有一个重要警告:例外。当异步(即,Task类似返回)方法失败时,预期的语义是捕获异常并将其放在返回的任务上。

所以,你不想只回来CompletedTask您还希望捕获异常并使用Task.FromException

public Task FooAsync()
{
  try
  {
    //do something synchronously
    if(x == 0)
        return Task.CompletedTask;
    else if(x < 5):
        //do something
        return Task.CompletedTask;
    // do something extra
    return Task.CompletedTask;
  }
  catch (Exception ex)
  {
    return Task.FromException(ex);
  }
}

在这一点上,有一些样板。你可能更愿意使用async 没有 await,因为这样的:

#pragma warning disable 1998
public async Task FooAsync()
#pragma warning restore 1998
{
    //do something synchronously
    if(x == 0)
        return;
    else if(x < 5):
        //do something
        return;
    // do something extra
}

这种方法的问题在于,除非包含丑陋的编译指示来禁用它们,否则您将得到编译器警告。如果您发现自己需要在多个地方执行此操作,则建议使用一些辅助方法(从AsyncEx库中窃取):

public static class TaskHelper
{
#pragma warning disable 1998
    public static async Task ExecuteAsTask(Action func)
#pragma warning restore 1998
    {
        func();
    }

#pragma warning disable 1998
    public static async Task<T> ExecuteAsTask<T>(Func<T> func)
#pragma warning restore 1998
    {
        return func();
    }
}

如此使用:

public Task FooAsync() => TaskHelper.ExecuteAsTask(() =>
{
    //do something synchronously
    if(x == 0)
        return;
    else if(x < 5):
        //do something
        return;
    // do something extra
});

这使您可以快速轻松地包装同步方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将同步方法转换为异步方法

来自分类Dev

Room:错误:不确定如何将Cursor转换为此方法的返回类型(void)

来自分类Dev

如何将同步ajax转换为异步?

来自分类Dev

如何将 void[] 转换为 U[]

来自分类Dev

在Android中将异步方法转换为同步方法

来自分类Dev

在Android中将异步方法转换为同步方法

来自分类Dev

如何将Array方法转换为ArrayList方法?

来自分类Dev

斯威夫特:如何将异步方法包装在同步方法中?

来自分类Dev

将同步方法转换为与C#异步

来自分类Dev

如何将“ void(MyClass :: *)(int)”转换为“ void(*)(int)”?

来自分类Dev

Javascript将异步转换为同步

来自分类Dev

如何将Web Api的异步调用和结果包装为同步方法?

来自分类Dev

您如何将enumerateDraggingItemsWithOptions方法调用转换为Swift?

来自分类Dev

如何将Expression转换为MethodBuilder实例方法?

来自分类Dev

如何将匿名函数转换为方法值?

来自分类Dev

java如何将参数转换为方法?

来自分类Dev

如何将QLineEdit的文本转换为方法?

来自分类Dev

如何将方法从C#转换为JQuery

来自分类Dev

如何将值从构造函数转换为方法?

来自分类Dev

如何将方法转换为作用域。

来自分类Dev

如何将方法转换为通用变体?

来自分类Dev

如何将异步迭代器转换为数组?

来自分类Dev

如何将.then .catch转换为异步/等待

来自分类Dev

如何将Struct *列表转换为void *列表?

来自分类Dev

如何将void *转换为size_t?

来自分类Dev

如何将void *转换为foo *以符合C ++?

来自分类Dev

如何将'\ 0'转换为const void *?

来自分类Dev

如何将列表转换为numpy.void

来自分类Dev

如何将void *转换为size_t?

Related 相关文章

热门标签

归档