首页 新闻 会员 周边

windows phone中终止线程,求高手帮忙

0
悬赏园豆:10 [已解决问题] 解决于 2012-04-12 09:00

各位大牛,今天在学习的时候遇到了这样一个问题,我创建了一个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();

}


}
}

界面截图:

 

在点击关闭按钮时的错误提示:

希望高手们帮帮我,看有没有什么方法可以解决这个问题,或者有什么另外的方式来处理线程,谢谢。

WaitingSky的主页 WaitingSky | 菜鸟二级 | 园豆:300
提问于:2012-04-05 12:33
< >
分享
最佳答案
2

            while (true)
            {          
                myDelegate = ChangeUI;//委托
                this.Dispatcher.BeginInvoke(myDelegate);
                Thread.Sleep(800);
            }

将while循环中的“true”改成一个bool变量。点那个按钮时,将其设为false不是行了。这样线程就结束了。

 

一般线程abort时都会异常。

收获园豆:10
一滴血 | 小虾三级 |园豆:1602 | 2012-04-05 13:18

经过这个改变后,我使用begin按钮使标识flag设为true,使用end按钮使标识flag设为false确实得到了想要的结果,但是只要是flag为false,while就退出循环,那我如何再次启动这个线程,是再次启动start方法,还是再创建一个线程实例?

WaitingSky | 园豆:300 (菜鸟二级) | 2012-04-07 08:49

@WaitingSky: 我表示这样就实现了我的意图,但不知到你觉得应该怎样?

        private void Calculator()
{
while (true)
{
while (flag)
{
myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
Thread.Sleep(800);
}
}
}
WaitingSky | 园豆:300 (菜鸟二级) | 2012-04-07 18:39

@WaitingSky: 这样改一下

 

        private void Calculator()
        {
            while (true)
            {
                while (flag)
{
                    myDelegate = ChangeUI;//委托
this.Dispatcher.BeginInvoke(myDelegate);
                    Thread.Sleep(800);
                }

Thread.Sleep(100);


            }
        }

一滴血 | 园豆:1602 (小虾三级) | 2012-04-08 10:14

@一滴血: 加一个Thread.Sleep(100);有什么好处吗?

WaitingSky | 园豆:300 (菜鸟二级) | 2012-04-08 20:15

@WaitingSky: 不加的话,当flag为false时,CPU会100%(线程里死循环)

一滴血 | 园豆:1602 (小虾三级) | 2012-04-09 09:06

@一滴血: 谢谢

WaitingSky | 园豆:300 (菜鸟二级) | 2012-04-12 08:59
其他回答(2)
0

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.

解决方案:使用BackgroundWorker代替它,简单又好用,还不容出错。
 
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-05 13:04

这是个好方法,有时间去学一学

支持(0) 反对(0) WaitingSky | 园豆:300 (菜鸟二级) | 2012-04-07 08:49
0

給 一個 全 局的變量。然後判斷 是否推出。同上。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-05 13:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册