这几行代码编译能通过,就是运行崩溃,谁能帮我看看问题出在哪里?

时间:2022-12-28 07:37:03
下面的代码,只要我在main函数里调用this.WS(),立即崩溃,为什么?

下面只有三个函数,都是很简单的,

第一个函数,开启一个线程。
第二个函数,就是线程内容,主要是一个循环,去改变背景颜色。
第三个函数,就是一个修改背景颜色的托管。



        private void WS()
        {
            Thread t = new Thread(new ThreadStart(delegate() { TWS(); }));  //开启一个线程
            t.IsBackground = true; //设置为后台线程
            t.Start();
        }
        public void TWS()
        {
            bool bl = true;
            while (true)
            {
                SolidColorBrush SCB = new SolidColorBrush();
                if (bl==true)
                {
                    bl = false;
                    SCB.Color = Colors.Red;
                }
                else if (bl==false)
                {
                    bl = true;
                    SCB.Color = Colors.Green;
                }
                this.BWCC(SCB);
                Thread.Sleep(500);
            }
        }
        //******修改颜色的委托******
        delegate void BWCC_Handle(SolidColorBrush SCB);
        void BWCC(SolidColorBrush SCB)
        {
            if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
            {
                this.Dispatcher.Invoke(new BWCC_Handle(this.BWCC), SCB);
            }
            else { this.Background = SCB; }
        }


11 个解决方案

#1


有没有人帮我调调,只要新建一个工程,然后把代码复制进去,然后在主函数里加上一句this.WS()即可编译通过。

但就是运行崩溃。能否帮忙看看问题出在哪里?

#2


你主线程都把最后的START都执行了就退出了,后台线程就没了。

#3


我的主线程是没有退出的。

我建立了一个WPF工程去调试,是界面程序,如下:

        public MainWindow()
        {
            InitializeComponent();
            this.WS();
        }


引用 2 楼 viewstates 的回复:
你主线程都把最后的START都执行了就退出了,后台线程就没了。

#4


我现在出现的问题是:程序崩溃了,而不是程序退出。


引用 2 楼 viewstates 的回复:
你主线程都把最后的START都执行了就退出了,后台线程就没了。

#5


我作了小小修改,代码如下,程序没有崩溃了,效果也是我想要的,请问原因是什么?




        private void WS()
        {
            Thread t = new Thread(new ThreadStart(delegate() { TWS(); }));  //开启一个线程
            t.IsBackground = true; //设置为后台线程
            t.Start();
        }
        public void TWS()
        {
            bool bl = true;
            while (true)
            {
                if (bl==true)
                {
                    bl = false;
                    this.BWCC(Brushes.Red);
                }
                else if (bl==false)
                {
                    bl = true;
                    this.BWCC(Brushes.Green);
                }
                Thread.Sleep(500);
            }
        }
        //******修改颜色的委托******
        delegate void BWCC_Handle(SolidColorBrush SCB);
        void BWCC(SolidColorBrush SCB)
        {
            if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
            {
                this.Dispatcher.Invoke(new BWCC_Handle(this.BWCC), SCB);
            }
            else { this.Background = SCB; }
        }





#6



    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.context = SynchronizationContext.Current;
            Timer timer = new Timer(this.timerCallback, null, 500, 500);
        }

        private SynchronizationContext context;
        private bool useRed;

        private void timerCallback(object obj)
        {
            this.context.Post(delegate
            {
                this.useRed = !this.useRed;
                this.Background = this.useRed ? Brushes.Red : Brushes.Green;
            }, null);
        }
    }

#7


我在5楼的代码成功了,而楼顶的代码,却崩溃,问题出在哪里呢?有没有人指点一下?

#8


我5楼的代码也是成功了,我现在想找出问题所在啊。

为什么楼顶的代码崩溃,而5楼的代码成功。

以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。

引用 6 楼 sofant 的回复:
C# code

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent()……

#9


你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。

#10


有啊,调试的时候,就是这个错误信息。那么,原因是什么呢?

引用 9 楼 sofant 的回复:
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。

#11


我想我明白你的意思了,就是这个new 应该要放在主线程中去。

引用 9 楼 sofant 的回复:
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。

#1


有没有人帮我调调,只要新建一个工程,然后把代码复制进去,然后在主函数里加上一句this.WS()即可编译通过。

但就是运行崩溃。能否帮忙看看问题出在哪里?

#2


你主线程都把最后的START都执行了就退出了,后台线程就没了。

#3


我的主线程是没有退出的。

我建立了一个WPF工程去调试,是界面程序,如下:

        public MainWindow()
        {
            InitializeComponent();
            this.WS();
        }


引用 2 楼 viewstates 的回复:
你主线程都把最后的START都执行了就退出了,后台线程就没了。

#4


我现在出现的问题是:程序崩溃了,而不是程序退出。


引用 2 楼 viewstates 的回复:
你主线程都把最后的START都执行了就退出了,后台线程就没了。

#5


我作了小小修改,代码如下,程序没有崩溃了,效果也是我想要的,请问原因是什么?




        private void WS()
        {
            Thread t = new Thread(new ThreadStart(delegate() { TWS(); }));  //开启一个线程
            t.IsBackground = true; //设置为后台线程
            t.Start();
        }
        public void TWS()
        {
            bool bl = true;
            while (true)
            {
                if (bl==true)
                {
                    bl = false;
                    this.BWCC(Brushes.Red);
                }
                else if (bl==false)
                {
                    bl = true;
                    this.BWCC(Brushes.Green);
                }
                Thread.Sleep(500);
            }
        }
        //******修改颜色的委托******
        delegate void BWCC_Handle(SolidColorBrush SCB);
        void BWCC(SolidColorBrush SCB)
        {
            if (this.Dispatcher.Thread != System.Threading.Thread.CurrentThread)
            {
                this.Dispatcher.Invoke(new BWCC_Handle(this.BWCC), SCB);
            }
            else { this.Background = SCB; }
        }





#6



    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.context = SynchronizationContext.Current;
            Timer timer = new Timer(this.timerCallback, null, 500, 500);
        }

        private SynchronizationContext context;
        private bool useRed;

        private void timerCallback(object obj)
        {
            this.context.Post(delegate
            {
                this.useRed = !this.useRed;
                this.Background = this.useRed ? Brushes.Red : Brushes.Green;
            }, null);
        }
    }

#7


我在5楼的代码成功了,而楼顶的代码,却崩溃,问题出在哪里呢?有没有人指点一下?

#8


我5楼的代码也是成功了,我现在想找出问题所在啊。

为什么楼顶的代码崩溃,而5楼的代码成功。

以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。

引用 6 楼 sofant 的回复:
C# code

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent()……

#9


你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。

#10


有啊,调试的时候,就是这个错误信息。那么,原因是什么呢?

引用 9 楼 sofant 的回复:
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。

#11


我想我明白你的意思了,就是这个new 应该要放在主线程中去。

引用 9 楼 sofant 的回复:
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。

SolidColorBrush SCB是在另一线程创建的。