首页 新闻 会员 周边 捐助

.net自定义线程类

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

今天看了一本C#入门经典的书, 上面讲到可以通过自定义线程类来实现很多相似的线程操作,如同时更新两个ProgressBar控件显示进度等等, 但是书中讲的方法好像版本比较低还是怎么地, 我用VS2005编译通不过, 很纠结. 但是我觉得这个还是很管用的, 有哪位大神做个这个问题的麻烦帮我解一下, 不胜感激! 

拾贝壳的主页 拾贝壳 | 初学一级 | 园豆:158
提问于:2012-12-01 11:18
< >
分享
最佳答案
1

要不你把代码贴出来,一起看看修改下,或者直接升级.Net吧

收获园豆:10
RyanCheng | 菜鸟二级 |园豆:474 | 2012-12-01 19:36

谢谢各位的关心, 这两天我也看了很多的资料, 已经把这个问题解决了, 现在我把我自己写的代码贴出来, 给各位看看, 如果不足的地方还请指教:

namespace ThreadClass
{
 public partial class Form1 : Form
    {
        private ThreadClass1 thread1, thread2;
        public Form1()
        {
            InitializeComponent();
            thread1 = new ThreadClass1(100, progressBar1, label1);
            thread2 = new ThreadClass1(200, progressBar2, label1);
        }
    }

   public class ThreadClass1
    {
        private ProgressBar progressBar1;
        private Label label1;
        private int ntime;
        private Thread thread1;
        public void UpdatePB(ProgressBar p1)
        {
            p1.Value += 1;
        }
        public void UpdateLB(Label l1, String sText)
        {
            l1.Text += sText;
        }
        public delegate void InvokeUpdatePB(ProgressBar p1);
        public delegate void InvokeUpdateLB(Label l1, string sText);
        public ThreadClass1(int nTime, ProgressBar p1, Label l1)
        {
            ntime = nTime;
            label1 = l1;
            progressBar1 = p1;
            thread1 = new Thread(new ThreadStart(Fun));
            thread1.Start();
        }

        public void Fun()
        {
            InvokeUpdatePB pb1 = new InvokeUpdatePB(UpdatePB);
            while (progressBar1.Value != 100)
            {
                if (progressBar1.InvokeRequired)
                {
                    progressBar1.Invoke(pb1, new object[] { progressBar1 });
                    Thread.Sleep(ntime);
                }
                else
                {
                    progressBar1.Value += 1;
                    Thread.Sleep(ntime);
                }
            }

            InvokeUpdateLB lb1 = new InvokeUpdateLB(UpdateLB);
            if (label1.Text == "")
            {
                if (label1.InvokeRequired)
                {
                    label1.Invoke(lb1, new object[] { label1, "線程1結束"});
                } 
                else
                {
                    label1.Text = "線程1結束";
                }
            } 
            else
            {
                if (label1.InvokeRequired)
                {
                    label1.Invoke(lb1, new object[] { label1, ", 線程2結束" });
                }
                else
                {
                    label1.Text += ", 線程2結束";
                }
            }
        }

    }
}
拾贝壳 | 园豆:158 (初学一级) | 2012-12-03 09:27
其他回答(2)
0

可能是你的版本比较低。。。

羽商宫 | 园豆:2490 (老鸟四级) | 2012-12-01 12:33

我是想有没有人能够给我一个含代码的例子!

支持(0) 反对(0) 拾贝壳 | 园豆:158 (初学一级) | 2012-12-01 13:42
0

Thread

Task

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-01 13:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册