运行在主UI线程下面将是灾难性的,因为用户界面将被冻结,反应迟钝。
AutoResetEvent resetEvent = new AutoResetEvent(false);
resetEvent.WaitOne();
相反,你可以使用信号和计时器。 在您的WinForms应用程序创建事件参数或其他合适的包装材料的队列来捕捉引发的事件的essense和包排队和离队的线程同步化的锁
在您创建引发事件,而不是单独的线程排队的数据或信号进入队列。
在你的winodws表单应用程序中有一个计时器,用于轮询队列中的任何新事件并相应地处理这些事件。
如果您使用,则下面的示例代码: 1)当一个事件是由控制的一个凸起只需调用,而不是在你的新主题开始一个新的线程 2)EnqueueEvent所有你要做的就是调用EnqueueEvent与一个新的信号,而不是引发一个事件。 当然,将MyEventSignal类替换为更适合您场景的类,并将计时器代码置于实际的定时器处理程序中。
public class MyEventSignal
{
public MyEventSignal()
{
}
public MyEventSignal(object _Sender, EventArgs _Args)
{
Sender = _Sender;
Args = _Args;
}
object Sender { get; set; }
EventArgs Args { get; set; }
}
private static object syncRoot = new object();
private static Queue<MyEventSignal> eventSignalQueue = new Queue<MyEventSignal>();
public static void EnqueueEvent(MyEventSignal NewEventSignal)
{
lock (syncRoot)
{
eventSignalQueue.Enqueue(NewEventSignal);
}
}
private static MyEventSignal DequeueEvent()
{
MyEventSignal result;
result = null;
lock (syncRoot)
{
if (eventSignalQueue.Count > 0)
{
result = eventSignalQueue.Dequeue();
}
}
return result;
}
private void TimerUI_Tick(object sender, EventArgs e)
{
MyEventSignal newSignal;
newSignal = DequeueEvent();
while (newSignal != null)
{
// start new thread to do stuff based on event signal
newSignal = DequeueEvent();
}
}
private void DoStuffOnParalleThread()
{
System.Threading.ThreadStart MyThreadStart;
System.Threading.Thread MyThread;
MyThreadStart = new System.Threading.ThreadStart(WorkerThreadRoutine);
MyThread = new System.Threading.Thread(MyThreadStart);
MyThread.Start()
}
private void WorkerThreadRoutine()
{
// Do stuff
//Instead of raising an event do this of course specify your event args
// or change the MyEventSignal class to suit
Form1.EnqueueEvent(new WinApp.Form1.MyEventSignal(this, EventArgs.Empty));
}
你能给出一些简单的示例代码来演示你的问题吗?后台线程如何创建这些事件?通过更改/与UI控件进行交互? – sloth
如果您开始希望等待动作完成并按顺序执行操作,则最好切换到调用方法(如果您不想要具体的依赖关系,则在接口上)。 –