Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:非阻塞睡眠_C#_Multithreading - Fatal编程技术网

C#:非阻塞睡眠

C#:非阻塞睡眠,c#,multithreading,C#,Multithreading,我正在为我的罗技G510液晶键盘编写一个小应用程序,遇到了一个小问题。在绘制到我的屏幕后,我希望我的程序变为空闲,并作为进程保持活动状态,但不消耗计算机中的任何资源 但是,每当引发某个事件时,我都需要打开一个表单。我相信Thread.Sleep()不是最好的方法 下面是我的代码大致的样子: int main(){ InitLCD(); DrawStuff(); Wait(); } void HandleEvent(){ //Create a Form if n

我正在为我的罗技G510液晶键盘编写一个小应用程序,遇到了一个小问题。在绘制到我的屏幕后,我希望我的程序变为空闲,并作为进程保持活动状态,但不消耗计算机中的任何资源

但是,每当引发某个事件时,我都需要打开一个表单。我相信
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是专门为此设计的