使接口实现异步

时间:2016-05-06 21:49:05

标签: c# async-await

我正在我的一个类和我的void RaisePostBackEvent(string eventArgument)System.Web.UI.IPostBackEventHandler async ... await`语法的实现体系中实现I am calling a method using the。 E.g。

public void RaisePostBackEvent(string eventArgument)
{
    if (eventArgument.Equals("deq1"))
    {
        Result result = await SaveDataAsync();
        OnSaved();
    }
}

但是,它会产生错误:

  

CS4033 - 'await'运算符只能在异步方法中使用

CS4033 - The 'await' operator can only be used within an async method

问题:Making interface implementations async描述了一个几乎完全相同的问题,关键区别在于OP实现的界面在他的控制之下,accepted answer要改变void DoSomething()Task DoSomething()的接口上。但是,我无法更改IPostBackEventHandler,因为它是.NET Framework的一部分。

有关如何以安全的方式解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:3)

即使未在界面中定义,也可以添加async修饰符 考虑到RaisePostBackEvent必须返回无效,因此它将作为"fire and forget"来电。如果这不是问题,只需添加async修饰符即可签名。

public async void RaisePostBackEvent(string eventArgument)
{
    if (eventArgument.Equals("deq1"))
    {
        Result result = await SaveDataAsync();
        OnSaved();
    }
}

答案 1 :(得分:1)

如果您的方法实现不是异步,那么您就不能等待"等待"在里面。 即使您实施的接口没有异步,也可以使方法实现异步无效。 你不能让你的方法实现异步任务,因为这会改变不好的返回值。

使方法实现async void的结果是调用者不会在返回之前等待方法完成。 尝试:

public async void RaisePostBackEvent(string eventArgument)
{
    if (eventArgument.Equals("deq1"))
    {
        Result result = await SaveDataAsync();
        OnSaved();
    }
}