【发布时间】:2017-03-13 11:48:50
【问题描述】:
我有一个带有 2 个线程的多线程程序。
一个线程正在检测 USB 插入和拔出。
第二个线程负责将文件传输到 USB(在 USB 插入事件中)。一旦所有文件都成功复制到 USB 然后,文件复制线程(第二个线程)应该进入“成功复制”状态并保持在那里直到USB被移除。移除 USB 后,isUSBInsterted 标志设置为 FALSE,文件复制线程(第二个线程)进入空闲状态。
public enum FileTransferStates { Idle = 0, FileCopyingState = 1, SuccessfullyCopiedState = 2 }
public void ExecuteUSBFileTransfer()
{
switch (CurrentState)
{
case FileTransferStates.Idle:
IdleState();
return;
case FileTransferStates.FileCopyingState:
FileCopyingState();
ExecuteUSBFileTransfer();
break;
case FileTransferStates.SuccessfullyCopiedState:
SuccessfullyCopiedState();
ExecuteUSBFileTransfer();
break;
default:
return;
}
}
private void SuccessfullyCopiedState()
{
//Current state is "FileTransferStates.SuccessfullyCopiedState"
if (!USB.isUSBInsterted)
CurrentState = FileTransferStates.Idle; //Resetting the State if the USB is removed
}
问题:目前,如果线程已进入SuccessfullyCopiedState(),我会一次又一次地调用父方法(ExecuteUSBFileTransfer()
)。我认为这是对 CPU 资源的浪费。此外,USB 可能会长时间保持插入状态。所以,我希望线程在这段时间内休眠,直到 USB 未被移除。我怎样才能留在SuccessfullyCopiedState() 而不检查 USB 移除而不浪费资源?
PS:基本上,我想将文件复制线程发送到SuccessfullyCopiedState()方法内的休眠阶段,直到USB没有被移除。
【问题讨论】:
-
根据伪代码很难回答这个问题。你知道阻塞和非阻塞 I/O 的区别吗?你知道 select() 作为等待输入和/或信号的低级方式吗?您的库是否有一个等待事件发生的方法?你的图书馆有回调吗?回调在哪个线程中执行?你知道线程和互斥体以及 Wait() 和 Notify() 吗?
-
顺便说一句。为什么第一个方法递归调用自己?这是通过递归来模拟事件循环的尝试吗?调用是结束递归的,但我认为.net 没有结束递归优化,或者有吗?通常,事件循环是通过循环实现的,因此得名 ^^.
-
@yeoman:我没有使用任何外部库。两个线程(USB 和 FileCopyingThread)都由 Main 函数(püublic static void main())启动。我知道有关线程和互斥锁的基本概念。我需要来自 USB 线程的全局通知,即 USB 已被移除,并且 FileCopyingThread 应该休眠直到它收到此通知。
-
@yeoman:第一种方法是递归调用自身......这就是我问这个问题的原因。如果我的线程可以休眠直到收到 USB 已收到的通知,那么我不需要一次又一次地输入
private void SuccessfullyCopiedState()。
标签: c# multithreading