启动线程(C#/ WPF)时MainWindow冻结

时间:2019-01-18 15:46:21

标签: c# wpf multithreading

基本问题: 我启动一个线程,该线程在创建时从WPF元素读取。之后,除了在MainWindow.xaml.cs中只是一个普通布尔变量之外,我再也不会写或读取任何元素了。

我阅读了有关将线程声明为后台线程或以某种方式从该线程分派UI的信息。两者都不起作用,我想我做错了。

我知道这会产生无限的外观,应该这样。我想无限地运行它,直到我按下停止按钮。

无论如何,这是我的代码受到打击,也许您可​​以向我展示如何正确解决此问题:

private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        t = new Thread(() => this.Dispatcher.Invoke(() =>
        {
            ThreadMethod(UserText.Text, PasswordPass.Password, IPText.Text, time * 60000);    //time*60000 = minute to milliseconds
        }));

        UserText.IsEnabled = false;
        PasswordPass.IsEnabled = false;
        IPText.IsEnabled = false;
        TimeSilder.IsEnabled = false;
        StartButton.IsEnabled = false;

        StopButton.IsEnabled = true;

        keepRunning = true;

        t.Start();
    }

private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            t.Join();
        }
        catch
        {
            Console.WriteLine("Threadschließen nicht durchgeführt");
        }

        UserText.IsEnabled = true;
        PasswordPass.IsEnabled = true;
        IPText.IsEnabled = true;
        TimeSilder.IsEnabled = true;
        StartButton.IsEnabled = true;

        StopButton.IsEnabled = false;

        keepRunning = false;
    }

private void ThreadMethod(string userName, string password, string mqttIP, int timer)
        {

            //recieveData(userName, password);
            //sendData(mqttIP);
            Console.WriteLine("Thread is running");
            Thread.Sleep(timer);
            if (keepRunning)
            {
                t = new Thread(() => this.Dispatcher.Invoke(() =>
                {
                    ThreadMethod(userName, password, mqttIP, timer);
                }));

                t.Start();
            }
        }

当我不启动线程时,一切都会很好。

感谢您的帮助!

0 个答案:

没有答案