如何在紧凑的框架中有效地发送呼叫和等待响应?
How to send a call and wait for response effectively in compact framework?
如果您需要发送一个在另一个线程中执行并将结果发回给您的调用(对于 例如:到一个 COM 端口),那么被调用的线程应该等到并行线程完成其操作。
如果你使用while(boolflag)
然后它变成一个线程密集型操作,它会循环到同一个语句,直到标志被设置,使程序分配更多的资源并且你会更快地进入一些多线程应用程序运行许多 While 循环等待时的内存管理问题。
.Net4.0 有 Async/Await 异步执行任务和 return 完成后的结果。但在 CF 3.5 中它不可用。
下面是解决方法。
为了在不花费更多资源的情况下有效等待,CF 3.5 提供了ManualResetEvent/AutoResetEvent
(ManualResetEvent 提供了对重置事件的更多控制,因此最推荐使用)。
声明一个 ManualResetEvent
private ManualResetEvent m_ManualWaitForResponse;
并且在调用者方法中,它将调用发送到另一个线程来执行一些进程和 returns 结果,
1.First 重置事件。
2.Then发送其他线程调用后等待响应,直到其他线程设置事件。
private void SendAndWaitForResponse(string command)
{
m_ManualWaitForResponse.Reset();
m_objComm.SendString(m_LastCommandSent);
m_Timer.Change(CScaleServer.constTWOSECOND, 0);
m_ManualWaitForResponse.WaitOne();
}
其他线程在作业完成后设置事件。
m_ManualWaitForResponse.Set()
在上述代码示例的第 3 行中,您可以看到 Timer
在 2 秒的到期时间后运行。这是出于安全目的,如果由于某些 COM 连接问题而没有从其他线程收到响应(或者)如果没有命令发送到 COM 并且父线程无限期地等待,则在计时器中设置相同的事件。
定时器代码:
private void eventOnTimer(object StateInfo)
{
m_ManualWaitForResponse.Set()
}
如果您需要发送一个在另一个线程中执行并将结果发回给您的调用(对于 例如:到一个 COM 端口),那么被调用的线程应该等到并行线程完成其操作。
如果你使用while(boolflag)
然后它变成一个线程密集型操作,它会循环到同一个语句,直到标志被设置,使程序分配更多的资源并且你会更快地进入一些多线程应用程序运行许多 While 循环等待时的内存管理问题。
.Net4.0 有 Async/Await 异步执行任务和 return 完成后的结果。但在 CF 3.5 中它不可用。
下面是解决方法。
为了在不花费更多资源的情况下有效等待,CF 3.5 提供了ManualResetEvent/AutoResetEvent
(ManualResetEvent 提供了对重置事件的更多控制,因此最推荐使用)。
声明一个 ManualResetEvent
private ManualResetEvent m_ManualWaitForResponse;
并且在调用者方法中,它将调用发送到另一个线程来执行一些进程和 returns 结果,
1.First 重置事件。
2.Then发送其他线程调用后等待响应,直到其他线程设置事件。
private void SendAndWaitForResponse(string command)
{
m_ManualWaitForResponse.Reset();
m_objComm.SendString(m_LastCommandSent);
m_Timer.Change(CScaleServer.constTWOSECOND, 0);
m_ManualWaitForResponse.WaitOne();
}
其他线程在作业完成后设置事件。
m_ManualWaitForResponse.Set()
在上述代码示例的第 3 行中,您可以看到 Timer
在 2 秒的到期时间后运行。这是出于安全目的,如果由于某些 COM 连接问题而没有从其他线程收到响应(或者)如果没有命令发送到 COM 并且父线程无限期地等待,则在计时器中设置相同的事件。
定时器代码:
private void eventOnTimer(object StateInfo)
{
m_ManualWaitForResponse.Set()
}