C#编译器要求我使我的函数可以等待,但它已经是?
问题描述:
success = await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);
给我此错误错误
在“等待”操作符只能异步方法内使用。考虑使用“异步”修饰符标记此方法,并将其返回类型更改为“任务”。 S:\ blissbox \ SOURCE_FILES \ Bliss-Box_api \ managed dx attempt \ 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;
}
}
我做错了什么?
答
问题是被调用函数的位置。这意味着,你叫下面的代码是不是一个异步函数:
success = await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);
一种解决方案可以这样调用异步函数如下:
var task = TaskEx.RunEx(async() =>
{
await _myHid.SendOutputReportViaInterruptTransfer(_deviceData, _hidHandle, outputReportBuffer);
});
var result = task.WaitAndUnwrapException();
+0
哇,我从来没有得到这种形式的S.O.上的所有线程。我读到这个,thx家伙。 –
编译器要求你做的方法从你也调用'SendOutputReportViaInterruptTransfer'' async'。 – dasblinkenlight
当你在你的项目中引入'async'时,你需要使'async'完成。换句话说,就像在Task.Run(async()=> {...})任务中封装调用一样;''你需要使所有的调用函数都是'async',并且所有的调用函数都是调用函数'async',一直在链上。 – lebelinoz