各位大牛,今天在学习的时候遇到了这样一个问题,我创建了一个wp7的项目,希望实现通过点击一个按钮创建一个线程来改变textblock的值,点击另一个按钮来关闭这个线程,但是一直报错,帮帮忙,这是怎么一回事啊。测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Threading;
namespace testThread
{
public partial class MainPage : PhoneApplicationPage
{
// 构造函数
public MainPage()
{
InitializeComponent();
}
delegate void MyDelegate();
Thread myThread;
MyDelegate myDelegate;
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
}
private void end_Click(object sender, RoutedEventArgs e)
{
if (myThread.IsAlive)
{
myThread.Abort();
}
}
private void begin_Click(object sender, RoutedEventArgs e)
{
myThread = new Thread(new ThreadStart(Calculator));
myThread.IsBackground = true;
myThread.Start();
}
private void Calculator()
{
while (true)
{
myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
Thread.Sleep(800);
}
}
int i;
private void ChangeUI()
{
i = int.Parse(this.myTextBlock.Text);
int j = i + 100;
this.myTextBlock.Text = (j).ToString();
}
}
}
界面截图:
在点击关闭按钮时的错误提示:
希望高手们帮帮我,看有没有什么方法可以解决这个问题,或者有什么另外的方式来处理线程,谢谢。
while (true)
{
myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
Thread.Sleep(800);
}
将while循环中的“true”改成一个bool变量。点那个按钮时,将其设为false不是行了。这样线程就结束了。
一般线程abort时都会异常。
经过这个改变后,我使用begin按钮使标识flag设为true,使用end按钮使标识flag设为false确实得到了想要的结果,但是只要是flag为false,while就退出循环,那我如何再次启动这个线程,是再次启动start方法,还是再创建一个线程实例?
@WaitingSky: 我表示这样就实现了我的意图,但不知到你觉得应该怎样?
private void Calculator()
{
while (true)
{
while (flag)
{
myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
Thread.Sleep(800);
}
}
}
@WaitingSky: 这样改一下
private void Calculator()
{
while (true)
{
while (flag)
{
myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
Thread.Sleep(800);
}
Thread.Sleep(100);
}
}
@一滴血: 加一个Thread.Sleep(100);有什么好处吗?
@WaitingSky: 不加的话,当flag为false时,CPU会100%(线程里死循环)
@一滴血: 谢谢
wp7中(silverlight中)不允许非信任用户代码执行Thread.Abort,微软已经说明这点,节选如下:
This member can be used only by trusted applications. If you try to use this member in a partial-trust application, your code will throw a MethodAccessException exception. This member is security-critical, which restricts its use.
这是个好方法,有时间去学一学
給 一個 全 局的變量。然後判斷 是否推出。同上。