【问题标题】:C# compiler asks me to make my function awaitable but it already is? [duplicate]C# 编译器要求我让我的函数可等待,但它已经是? [复制]
【发布时间】:2017-11-18 15:46:41
【问题描述】:

这一行

 success = await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);

给我这个错误错误

“await”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。 S:\blissbox\SOURCE_FILES\Bliss-Box_api\托管 dx 尝试\BBAPI.cs 40

这是我的方法。

internal async Task<Boolean> SendOutputReportViaInterruptTransfer
            (FileStream fileStreamDeviceData, SafeFileHandle hidHandle, Byte[] outputReportBuffer)
        {
            try
            {
                var success = false;

                    // Begin writing the Output report. 

                    Task t = fileStreamDeviceData.WriteAsync(outputReportBuffer, 0, outputReportBuffer.Length);

                    await t;

                    // Gets to here only if the write operation completed before a timeout.

                    Debug.Print("Asynchronous write completed");

                    // The operation has one of these completion states:

                    switch (t.Status)
                    {
                        case TaskStatus.RanToCompletion:
                            success = true;
                            Debug.Print("Output report written to device");
                            break;
                        case TaskStatus.Canceled:
                            Debug.Print("Task canceled");
                            break;
                        case TaskStatus.Faulted:
                            Debug.Print("Unhandled exception");
                            break;
                    }

                return success;
            }
            catch (Exception ex)
            {
                DisplayException(ModuleName, ex);
                throw;
            }
        }

我做错了什么?

【问题讨论】:

  • 编译器要求您创建用于调用 SendOutputReportViaInterruptTransfer async 的方法。
  • 当你在你的项目中引入async 时,你需要让async 一直向上。换句话说,如果没有将调用封装在像Task.Run(async() =&gt; { ... }); 这样的任务中,您需要将所有调用函数async,以及所有这些调用函数的调用函数async,一路向上。

标签: c# async-await


【解决方案1】:

问题是被调用函数的位置。这意味着您调用以下代码的位置不是异步函数:

success = await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);

一个解决方案可以像下面这样调用这个异步函数:

var task = TaskEx.RunEx(async () => 
{
   await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);
});
var result = task.WaitAndUnwrapException();

【讨论】:

  • 哇,我永远不会从 S.O. 上的所有线程中获得这种形式。我读到了这个,谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多