gpt4 book ai didi

c# - 异步调用机制设计c#

转载 作者:行者123 更新时间:2023-11-30 16:30:05 26 4
gpt4 key购买 nike

需求是不断从硬件中读取数据并将数据发送到用于进一步处理的上层。

目前我使用的是同步机制。 IE请求 --> 等待 --> 读取 ---> 发送以供处理。

    do
{

int ix = iy;
iy = 0;

if(ix<1)
{
while (((ix = ReadSst(ref sBuffer)) < 1) && bProcessNotEnded == true)
{
if (ix < 0) // BT Error
{
eErr = CError.BUFF_KILL; //Throw error and exit
break;
}

Thread.Sleep(2);

iTimeOut += 2;
if (iTimeOut > TIMEOUT_2000)
{
eErr = CError.TIMEOUT_ERR;
objLogger.WriteLine("HW TIMED OUT");
break;
}

}
}

iBytesRead = ix;

if (iBytesRead <= 0)
{
eErr = CError.READ_ERR;
objLogger.WriteLine("READ ERROR");
break;
}

sReadMsg = sReadMsg + sBuffer;


if(sReadMsg.Length >0)
iEndPos = sReadMsg.IndexOf('\n',1);
else
iEndPos = -1;


if (sReadMsg.Length > 2)
{
if ((iEndPos == 0 && sReadMsg[0] == '\n') || (iEndPos > 0 && sReadMsg[sReadMsg.Length - 1] == '\n' && sReadMsg[sReadMsg.Length - 2] == '\r')) //finished
{
Thread.Sleep(50); // wait a short time to be sure there that there is no further input
if (sReadMsg.Length >= 3 && sReadMsg[sReadMsg.Length - 3] == 'a')
continue;

iy = ReadSst(ref sBuffer);
if (iy == 0)
{
bProcessNotEnded = false;
objLogger.WriteLine("bProcessNotEnded is made false, End of frame detected");
break;
}
else if (iy < 0)
{
eErr = CError.BUFF_KILL; // error
break;
}
}
}


} while (bProcessNotEnded);

ReadSst 方法是调用硬件以请求数据。

从代码中可以看出,当前的逻辑循环并读取直到 bProcessNotEnded 标志为真。一旦在接收到的字符串缓冲区中检测到帧结束,我将标志设置为 false 并停止循环(从硬件读取也是如此)

现在我需要在我的代码中实现一些并行性以提高性能,我想学习以异步方式完成读取的方式来改进它。

任何愿意帮助我改进现有设计的人。

提前致谢

最佳答案

在 .NET 中通常有三种常见的异步工作模式:

  1. Asynchronous Programming Model
  2. Event-based asynchronous programming model
  3. Task parallel library (.NET 4.0)

对于明显低级的代码,我会选择 1 或 3,因为 2 通常用于更高级别的组件。

一般的设计是使用上述任何一种方法在单独的线程中执行循环,当循环完成时通知调用线程操作已完成,传递结果(在你的情况下这应该是sReadMsg 的内容)以适当的方式(取决于您选择的方式)。

这是一个简短的示例,说明使用 TPL 可以多么轻松地做到这一点:

private void ReadMessageAsync()
{
// Set up the task to read the message from the hardware device.
Task<string> readMessageTask = new Task<string>(ReadMessage);

// Set up the task to process the message when the message was read from the device.
readMessageTask.ContinueWith(ProcessMessage);

// Start the task asynchronously.
readMessageTask.Start();
}

private void ProcessMessage(Task<string> readMessageTask)
{
string message = readMessageTask.Result;

// Process the message
}

private string ReadMessage()
{
string message = string.Empty;

// Retrieve the message using your loop

return message;
}

关于c# - 异步调用机制设计c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5959696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com