0

在我的控制台应用程序中,在线程中同步事件很困难。

using System;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    public class Example
    {
        private static Button _button;
        private static readonly EventWaitHandle Ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
        private static readonly EventWaitHandle Btn = new EventWaitHandle(false, EventResetMode.ManualReset);

        [STAThread]
        public static void Main()
        {
            _button = new Button();
            _button.Click += _button_Click;
            for (int i = 0; i <= 0x4; i++)
            {
                var t = new Thread(ThreadProc);
                t.Start(i);
            }
            Console.WriteLine("Press ENTER to release a waiting thread.");
            Console.ReadLine();
            Ewh.Set();
            Console.ReadLine();
        }

        private static void _button_Click(object sender, EventArgs e)
        {
            Console.WriteLine(new Random().Next(0x1388));
            Thread.Sleep(10);
            Btn.Set();
        }

        public static void ThreadProc(object data)
        {
            _button.PerformClick();
            Btn.WaitOne();
            Btn.Reset();
            Console.WriteLine("Thread {0} blocks.", data);
            Ewh.WaitOne();
            Console.WriteLine("Thread {0} exits.", data);
        }
    }
}

应用程序以一些随机数的形式给出结果,然后是线程块,并且在发出EventWaihandle数据线程退出的信号后打印在控制台上。

目的是通过以下方式打印数据,例如

*随机数据

线程块

随机数据

线程块

……

线程退出

...*

样本输出

1234

线程 2 块

2345

线程 0 块

3456

线程 1 块

……

线程 1 退出

线程 4 退出

……

如何以这种方式在线程内同步线程和事件。

4

2 回答 2

0

请改用任务计划程序和同步上下文。在主线程中创建一个同步上下文,并将其传递给您要在主线程中执行的任务。

于 2012-12-27T12:31:41.380 回答
0

这是我的代码。它使用 Btn 的 AutoResetEvent。另外,我看到您正在创建 Button 并从后台线程访问它。我删除了这段代码,而是直接调用了 ButtonClick 方法。这是生成的代码:

using System;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    public class Example
    {
        private static Button _button;
        private static readonly EventWaitHandle Ewh = new EventWaitHandle(true, EventResetMode.ManualReset);
        private static readonly EventWaitHandle Btn = new EventWaitHandle(true, EventResetMode.AutoReset);
        [STAThread]
        public static void Main()
        {
            Ewh.Reset();
            _button = new Button();
            _button.Click += _button_Click;
            for (int i = 0; i <= 0x4; i++)
                new Thread(ThreadProc).Start(i);
            Console.WriteLine("Press ENTER to release a waiting thread.");
            Console.ReadLine();
            Ewh.Set();
            Console.ReadLine();
        }

        private static void _button_Click(object sender, EventArgs e)
        {
            Console.WriteLine(new Random().Next(0x1388));
            Thread.Sleep(10);
        }

        public static void ThreadProc(object data)
        {
            Btn.WaitOne();
            Console.WriteLine("Thread {0} blocks.", data);
            _button.PerformClick();
            Btn.Set();
            Ewh.WaitOne();
            Console.WriteLine("Thread {0} exits.", data);
        }
    }
}
于 2012-12-27T14:15:06.793 回答