调用在另一个线程上运行的方法

时间:2019-01-23 00:57:25

标签: c# .net multithreading .net-core

我正在从一个经理类创建多个不同的线程。现在,当父应用程序中的变量更改时,我需要更新每个线程。

所以我希望能够在线程内调用一个函数。最好的方法是什么?该线程具有对管理器类的引用,因此我想从该线程中轮询管理器中的一个函数以检查变量的更改,但这似乎不对,肯定有更好的方法。我看了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?

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链接有点复杂。我发现这是一个非常容易上手的教程:

https://www.youtube.com/watch?v=grHxRCtETP8