A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蛋壳 中级黑马   /  2014-1-13 01:51  /  1301 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求解带参数的方法线程是如何执行

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
弄清此问题前要知道一个很重要的知识点就是委托,
回复 使用道具 举报
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;  using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading;    namespace MulThread {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();             //TextBox.CheckForIllegalCrossThreadCalls = false;//显示计数不安全模式定义             dgShowMsgInTextBox = new DGShowMsgInTextBox(DoShowMsgInTextBox);//安全模式         }         private void btnCount_Click(object sender, EventArgs e)         {             Count();         }         private void Count()         {             DateTime begingTime = DateTime.Now;             for (int i = 0; i < 999999999; i++) { txtNum.Invoke(dgShowMsgInTextBox, i.ToString()); }             DateTime endTime = DateTime.Now;             TimeSpan ts = endTime.Subtract(begingTime);             MessageBox.Show("计算完毕,总耗时:"+ts.TotalMilliseconds.ToString());         }         private void CountAndShow()         {             DateTime begingTime = DateTime.Now;             for (int i = 0; i < 100000; i++)             {                 txtNum.Text = i.ToString();             }             DateTime endTime = DateTime.Now;             TimeSpan ts = endTime.Subtract(begingTime);             MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());         }         private void CountAndShowSafety()         {             DateTime begingTime = DateTime.Now;             for (int i = 0; i < 100000; i++)             {                 this.Invoke(dgShowMsgInTextBox, i.ToString());             }             DateTime endTime = DateTime.Now;             TimeSpan ts = endTime.Subtract(begingTime);             MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());         }         //计算多线程         private void btnCountByThread_Click(object sender, EventArgs e)         {             Thread thread = new Thread(Count);             thread.IsBackground = true;             thread.Start();         }         ////显示计数不安全模式         private void button1_Click(object sender, EventArgs e)         {             Thread thread = new Thread(CountAndShow);             thread.IsBackground = true;             thread.Start();         }         //显示计数安全模式         private void button2_Click(object sender, EventArgs e)         {             Thread thread = new Thread(CountAndShowSafety);             thread.IsBackground = true;             thread.Start();         }         delegate void DGShowMsgInTextBox(string msg);         DGShowMsgInTextBox dgShowMsgInTextBox = null;         void DoShowMsgInTextBox(string msg)          {             txtNum.Text = msg;         }     }        }  using System;  using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading;    namespace 线程执行带参数的方法 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();             TextBox.CheckForIllegalCrossThreadCalls = false;         }                 public void AddTest(object s)         {             txtNum.AppendText(s.ToString());         }          public void AddTest2(object s)         {             myPara mp1 = s as myPara;             txtNum.AppendText(mp1.a+mp1.b);         }          //计算第一个参数         private void btnCount_Click(object sender, EventArgs e)         {             ParameterizedThreadStart pts = new ParameterizedThreadStart(AddTest);             Thread thread = new Thread(pts);             thread.Start("hahahha");         }          //计算多个参数         private void button1_Click(object sender, EventArgs e)         {             ParameterizedThreadStart pts = new ParameterizedThreadStart(AddTest2);             Thread thread = new Thread(pts);             myPara mp = new myPara();             mp.a = "aaaa";             mp.b = "bbbb";             thread.Start(mp);         }          //不安全访问结果         private void button2_Click(object sender, EventArgs e)         {             Thread thread1 = new Thread(SetTextStatic);             thread1.Name = "t1";             Thread thread2 = new Thread(SetTextStatic);             thread2.Name = "t2";             thread1.Start();             thread2.Start();         }         void SetTextStatic()         {             for (int i = 0; i < 1000; i++)             {                 int sco = int.Parse(txtNum.Text.Trim());                 sco++;                 txtNum.Text = sco.ToString();             }         }     } }
回复 使用道具 举报
1、第一种解决方法
   static void zhaddng(object o)
        {
            Console.WriteLine(o.ToString());
        }
ParameterizedThreadStart ps = new ParameterizedThreadStart(zhaddng);
            Thread thread = new Thread(ps);
            thread.Start((object)"sdfsdfsa");//参数传递在这里,强制转换为object类型
2、第二种方法
通过一个无参方法(类中无参方法),所有的参数都封装到类中的属性或字段中,在方法中对这些参数进行操作。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马