我正在从一个经理类创建多个不同的线程。现在,当父应用程序中的变量更改时,我需要更新每个线程。
所以我希望能够在线程内调用一个函数。最好的方法是什么?该线程具有对管理器类的引用,因此我想从该线程中轮询管理器中的一个函数以检查变量的更改,但这似乎不对,肯定有更好的方法。我看了Dispatcher课,但这似乎也不对。有人可以推荐最好的方法吗?
account1 = new Account(this);
account2 = new Account(this);
Thread accountThread1 = new Thread(new ThreadStart(account1.Run));
Thread accountThread2 = new Thread(new ThreadStart(account2.Run));
accountThread1.Start();
accountThread2.Start();
// How do I call method on accountThread1 or 2?
答案 0 :(得分:0)
如果我理解正确,则您需要一种适当的方式来处理线程。 我无法给您正确的方法,但这是我处理线程以从PLC 24/7获取数据而不会崩溃的方法。
样品如下:
//Create list of thread
private List<Thread> threads = new List<Thread>();
private void RunThread(YourClass yourclass)
{
switch (yourclass.ConnStat)
{
case ConnStatus.DISCONNECTED:
{
Thread oldthread = threads.FirstOrDefault(i => i.Name == yourclass.ID.ToString());
if (oldthread != null)
{
//Clean old thread
threads.Remove(oldthread);
}
else
{
//Add event here
yourclass.OnResponseEvent += new EventHandler<YourClass.ResponseEventArgs>(work_OnResponseEvent);
yourclass.OnNotificationEvent += new EventHandler<YourClass.NotificationEventArgs>(work_OnInfoEvent);
}
try
{
//Add thread to list
Thread thread = new Thread(new ThreadStart(() => yourclass.Initialize())) { Name = yourclass.ID.ToString(), IsBackground = true };
thread.Start();
threads.Add(thread);
Thread.Sleep(100);
}
catch (ThreadStateException ex)
{
MessageBox.Show(ex.Message);
}
break;
}
case ConnStatus.CONNECTED:
{
MessageBox.Show(string.Format("ID:{0}, is currently running!", yourclass.ID));
break;
}
case ConnStatus.AWAITING:
{
MessageBox.Show(string.Format("ID:{0}, is currently awaiting for connection!", yourclass.ID));
break;
}
}
}
//To control your class within thread
private void StopThread(YourClass yourclass)
{
if (yourclass.ConnStat == ConnStatus.CONNECTED || yourclass.ConnStat == ConnStatus.AWAITING)
{
//Call your method
yourclass.Disconnect();
yourclass.OnResponseEvent -= work_OnResponseEvent;
yourclass.OnDBResponseEvent -= work_OnDBResponseEvent;
yourclass.OnNotificationEvent -= work_OnInfoEvent;
Thread oldthread = threads.FirstOrDefault(i => i.Name == yourclass.ID.ToString());
if (oldthread != null) threads.Remove(oldthread);
}
}
希望这会有所帮助
答案 1 :(得分:0)
因此,解决方案是使用Observer Pattern将变量更改有效地推送到线程中,以实现所需的结果。
使用观察者模式,所有正在运行的线程都可以监视父应用程序中的变量以进行更改。这样,线程不会轮询父级,但是线程可以响应主应用程序中变量的更改,从而有效地将更改后的变量推送到所有线程中。
MS Docs链接有点复杂。我发现这是一个非常容易上手的教程: