C#:非阻塞睡眠
我正在为我的罗技G510液晶键盘编写一个小应用程序,遇到了一个小问题。在绘制到我的屏幕后,我希望我的程序变为空闲,并作为进程保持活动状态,但不消耗计算机中的任何资源 但是,每当引发某个事件时,我都需要打开一个表单。我相信C#:非阻塞睡眠,c#,multithreading,C#,Multithreading,我正在为我的罗技G510液晶键盘编写一个小应用程序,遇到了一个小问题。在绘制到我的屏幕后,我希望我的程序变为空闲,并作为进程保持活动状态,但不消耗计算机中的任何资源 但是,每当引发某个事件时,我都需要打开一个表单。我相信Thread.Sleep()不是最好的方法 下面是我的代码大致的样子: int main(){ InitLCD(); DrawStuff(); Wait(); } void HandleEvent(){ //Create a Form if n
Thread.Sleep()
不是最好的方法
下面是我的代码大致的样子:
int main(){
InitLCD();
DrawStuff();
Wait();
}
void HandleEvent(){
//Create a Form if none exists
}
//Must be called before exiting
void OnExit()
{
CloseLCD();
}
也许一个关注事件的独立线程是一个解决方案?如果是,怎么做
EDIT://该应用程序是一个不可见的WinForm应用程序。这意味着,启动时不会创建任何表单。只有在引发所述事件时,才会创建实际的表单。请尝试以下方式:
public static class Program
{
private static AutoResetEvent waithandle = new AutoResetEvent(true);
static void Main()
{
LCDClass lcd = new LCDClass();
lcd.mid_event += LcdOnMidEvent;
lcd.exit_event += LcdOnExitEvent;
lcd.init();
Thread thread = new Thread(lcd.DrawStuff);
thread.Start(waithandle);
waithandle.WaitOne();
}
private static void LcdOnExitEvent(object sendet, EventArgs eventArgs)
{
//lcd work finished
}
private static void LcdOnMidEvent(object sendet, EventArgs eventArgs)
{
// handle event, create form
Application.Run(new MyForm());
}
}
internal class LCDClass
{
private AutoResetEvent waithandle;
internal delegate void MyEventHandler(object sendet, EventArgs e);
internal event MyEventHandler mid_event;
protected virtual void OnMidEvent(object sendet)
{
MyEventHandler handler = mid_event;
if (handler != null) handler(sendet, EventArgs.Empty);
}
internal event MyEventHandler exit_event;
protected virtual void OnExitEvent(object sendet)
{
MyEventHandler handler = exit_event;
if (handler != null) handler(sendet, EventArgs.Empty);
}
public void init()
{
}
public void DrawStuff(object state)
{
// do work here
// raise event
mid_event(this, null);
//do more work
// raise event
exit_event(this, null);
waithandle.Set();
}
}
这是一个Winform应用程序,对吗?它实际上是一个“不可见”的应用程序。也就是说,执行后没有UI,除非引发事件,然后创建WinForm。程序如何保持活动状态?直到int
Main()
存在或Application.Run()
您等待的事件是什么?将其作为普通WinForms应用程序编写,但在需要时隐藏主窗体,然后显示()。您不必担心创建自己的空闲循环,因为它已经内置到应用程序中。内存使用情况如何?它看起来很消耗,虽然我不能测试它-不是真的!waithandle是专门为此设计的