下面只有三个函数,都是很简单的,
第一个函数,开启一个线程。
第二个函数,就是线程内容,主要是一个循环,去改变背景颜色。
第三个函数,就是一个修改背景颜色的托管。
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();
}
我建立了一个WPF工程去调试,是界面程序,如下:
public MainWindow()
{
InitializeComponent();
this.WS();
}
#4
我现在出现的问题是:程序崩溃了,而不是程序退出。
#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楼的代码成功。
以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。
为什么楼顶的代码崩溃,而5楼的代码成功。
以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。
#9
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。
SolidColorBrush SCB是在另一线程创建的。
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。
SolidColorBrush SCB是在另一线程创建的。
#10
有啊,调试的时候,就是这个错误信息。那么,原因是什么呢?
#11
我想我明白你的意思了,就是这个new 应该要放在主线程中去。
#1
有没有人帮我调调,只要新建一个工程,然后把代码复制进去,然后在主函数里加上一句this.WS()即可编译通过。
但就是运行崩溃。能否帮忙看看问题出在哪里?
但就是运行崩溃。能否帮忙看看问题出在哪里?
#2
你主线程都把最后的START都执行了就退出了,后台线程就没了。
#3
我的主线程是没有退出的。
我建立了一个WPF工程去调试,是界面程序,如下:
public MainWindow()
{
InitializeComponent();
this.WS();
}
我建立了一个WPF工程去调试,是界面程序,如下:
public MainWindow()
{
InitializeComponent();
this.WS();
}
#4
我现在出现的问题是:程序崩溃了,而不是程序退出。
#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楼的代码成功。
以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。
为什么楼顶的代码崩溃,而5楼的代码成功。
以便下次不再犯同样的错误啊。如果这个问题不解决,下次还是不懂。
#9
你在调试时没有收到错误信息?
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。
SolidColorBrush SCB是在另一线程创建的。
System.InvalidOperationException
无法使用 DependencyObject,它属于其父 Freezable 之外的其他线程。
SolidColorBrush SCB是在另一线程创建的。
#10
有啊,调试的时候,就是这个错误信息。那么,原因是什么呢?
#11
我想我明白你的意思了,就是这个new 应该要放在主线程中去。