gpt4 book ai didi

c# - 将线程发送到休眠状态直到事件发生

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

我有一个包含 2 个线程的多线程程序。

一个线程正在检测 USB 插入和拔出。

第二个线程负责将文件传输到 USB(在 USB 插入事件中)。一旦所有文件都成功复制到 USB,文件复制线程(第二个线程)应该进入“成功复制”状态并留在那里直到 USB 被移除。一旦 USB 被移除,isUSBInsterted 标志设置为 FALSE,文件复制线程(第二个线程)进入 IDLE 状态.

 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
}

问题:目前,我正在调用父方法(ExecuteUSBFileTransfer()
) 一次又一次,如果线程已经进入 SuccessfullyCopiedState()。我认为这是CPU资源的浪费。此外,USB 可能会保持插入很长时间。所以,我希望线程在这段时间内休眠,直到 USB 未被移除。如何在不浪费资源的情况下保持 SuccessfullyCopiedState() 并且不检查 USB 移除?

PS: 基本上,我想将 File Copying Thread 发送到 SuccessfullyCopiedState() 方法内的休眠阶段,直到 USB 不可用已删除。

最佳答案

您正在寻找:

自动重置事件(手动重置事件)

简单地说:这些将允许您“卡住”一个线程,直到它收到来自另一个线程的“开始”。

有一个完整的example来自 Eren Ersönmez 在另一个问题的答案中,它使用了 2 个工作线程,但仍然很容易掌握。

本质上,您有这个 AutoResetEvent 对象,它会在您调用 .WaitOne() 时阻止线程的执行。一旦您从您喜欢的任何线程调用 .Set(),此“ block ”将被重置。

例子:

static readonly AutoResetEvent fileCopyEvent = new AutoResetEvent(false);

bool keepFileCopyThreadAlive = true;
void FileCopyThread()
{
while (keepFileCopyThreadAlive)
{
fileCopyEvent.WaitOne();
if (!keepFileCopyThreadAlive) return; // Exit thread if told to.
Console.WriteLine("Copying files...");
Thread.Sleep(1000); // Do your stuff here
Console.WriteLine("Done copying files, waiting for USB Thread.");
}
}

此时您所要做的就是从 USB 线程调用:fileCopyEvent.Set();。这将释放“ block ”并执行 fileCopyEvent.WaitOne(); 下面的任何操作。由于这是一个 AutoResetEvent 对象,它将自动返回到其“阻塞”状态,您无需执行任何其他操作。该循环将强制代码返回到 .WaitOne() 并为您下次调用 .Set() 做好准备。

退出线程就像设置 keepFileCopyThreadAlive = false; 然后调用通常的 .Set() 一样简单。因为有一次退出循环的检查 keepFileCopyThreadAlive == false

注意:以上代码未经测试,目前没有可用的编译器。

关于c# - 将线程发送到休眠状态直到事件发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42762921/

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