这是一个非常简单的程序。在我发送请求发回的常量消息的消息后,我正在尝试从控制器读出消息。第一部分是我如何设法使读取按预期工作,每次发送消息时我都可以在控制台中看到它。我想用下面的代码中的任务重新创建这个场景。我怎么没有成功这样做。
if (success)
{
if (fileStreamDeviceData.CanRead)
{
while(success)
{
await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length);
for (int b = 0; b < 12; b++)
{
Console.Write(outputReportBuffer[b] + " ");
}
Console.WriteLine();
}
}
}
所以上面的部分按预期工作,除了当前正在发生的丑陋无尽的while循环。以下2个代码部分是解决方案,但它没有按预期工作,我似乎没有得到任何东西。我真的很不喜欢异步任务和东西,所以也许有人可以帮我解决下面的部分。
if (success)
{
outputReportBuffer = null;
//start async reading
try
{
outputReportBuffer = await ReadByteAsync();
for (int b = 0; b < outputReportBuffer.Length; b++)
{
Console.Write(outputReportBuffer[b] + " ");
}
Console.WriteLine();
}
catch (Exception ex)
{
throw ex;
}
}
private async Task<Byte[]> ReadByteAsync()
{
Byte[] result = null;
Byte[] outputReportBuffer = null;
using (fileStreamDeviceData)
{
outputReportBuffer = new Byte[MyHid.Capabilities.OutputReportByteLength];
int byteRead;
while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length)) != 0)
{
result = outputReportBuffer;
}
return result;
}
}
使用此代码时,我没有任何异常或任何输出。
答案 0 :(得分:1)
我可能是由于很多原因,尝试在首次循环时打印内容。
调用者outputReportBuffer = await ReadByteAsync();
是否在asyn方法中?如果不是,我会改为使用ReadByteAsync().Result
并在ConfigureAwait(false)
方法中设置ReadByteAsync()
。
const int BufferSize = 100;
private async Task<Byte[]> ReadByteAsync()
{
var memoryStream = new MemoryStream();
using (fileStreamDeviceData)
{
var outputReportBuffer = new Byte[BufferSize];
int offset = 0;
int byteRead;
while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, offset, outputReportBuffer.Length)) != 0)
{
memoryStream.Write(outputReportBuffer, offset, byteRead);
offset += BufferSize;
}
return memoryStream.ToArray();
}
}