1. winform 多線程編程,用兩個線程,一個自加,一個顯示
你這個要求在多線程編程中其實是個典型的生產者——消費者模式。即A線程負責生產數據,B線程讀取這些數據並使用。
我寫了一個windows窗體程序,窗體命名為form1,主要控制項是一個button和一個textbox,button命名為button1,textbox命名為textBox1。你做好這個窗體後,把下面的cs代碼拷到form1的代碼文件中就可以了。
public partial class Form1 : Form
{
private int cnt;
private Thread caculateThread;
private Thread readerThread;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
caculateThread = new Thread(new ThreadStart(delegate()
{
while (true)
{
cnt++;
Thread.Sleep(300);
}
}));
caculateThread.Start();
readerThread = new Thread(new ThreadStart(delegate()
{
while (true)
{
textBox1.Invoke(new MethodInvoker(delegate()
{
textBox1.Text = cnt.ToString();
}));
Thread.Sleep(300);
}
}));
readerThread.Start();
}
}
2. C# winform動態創建多線程
1 private void Form1_Load(object sender, EventArgs e)
2 {
3 Thread newthread = new Thread(new ThreadStart(BackgroundProcess));
4 newthread.Start();
5
6 }
7
8 /// <summary>
9 /// 定義一個代理
10 /// </summary>
11 private delegate void CrossThreadOperationControl();
12
13 private void BackgroundProcess()
14 {
15 // 將代理實例化為一個匿名代理
16 CrossThreadOperationControl CrossDelete = delegate()
17 {
18 int i = 1;
19 while (i < 5)
20 {
21 // 向列表框增加一個項目
22 listBox1.Items.Add("Item " + i.ToString());
23 i++;
24 }
25 label1.Text = "我在新線程里訪問這個lable!";
26 listBox1.Items.Add(label1.Text);
27 };
28 listBox1.Invoke(CrossDelete);
29 }
收集一下,在C# winform編程中多線程操作控制項時,可以有下面種方法:
1. 又看到一種方法(2014.1.6):
1. 剛看到一種方法(2014.1.5):
1 private void btnTest_Click(object sender, EventArgs e)
2 {
3 if (this.txtIP.Text.Trim() != "" && this.txtPort.Text.Trim() != "")
4 {
5 string proxy = this.txtIP.Text.Trim() + ":" + this.txtPort.Text.Trim();
6 string result = string.Empty;
7 this.btnTest.Enabled = false;
8 new Thread(delegate
9 {
10 Stopwatch stopwatch = new Stopwatch();
11 stopwatch.Start();
12 HttpClient httpClient = new HttpClient();
13 httpClient.Proxy = new WebProxy(proxy);
14 httpClient.TimeOut = 2000;
15 object result;
16 try
17 {
18 string a = httpClient.Get("http://www..com", "", "", "", "", "get");
19 if (a != "")
20 {
21 result = "響應成功!";
22 }
23 else
24 {
25 result = "響應失敗!";
26 }
27 }
28 catch
29 {
30 }
31 stopwatch.Stop();
32 result = result;
33 result = string.Concat(new object[]
34 {
35 result,
36 ",響應花費:",
37 stopwatch.ElapsedMilliseconds,
38 "ms"
39 });
40 this.BeginInvoke(delegate
41 {
42 this.lbResult.Text = result;
43 this.btnTest.Enabled = true;
44 });
45 })
46 {
47 IsBackground = true
48 }.Start();
49 }
50 else
51 {
52 this.lbResult.Text = "請輸入完整再提交!";
53 }
54 }
1. 直接使用表達式和Action()
1 private void btnInitEnv_Click(object sender, EventArgs e)
2 {
3 //初始化環境時回顯出來的文字不讓看
4 try
5 {
6 this.textBoxOutPut.Clear();
7 this.btnInitEnv.Enabled = false;
8 this.labelStateInfo.Text = "";
9 this.labelStateInfo.ForeColor = Color.Red;
10
11 if (!WriteToSerialPort("diags"))
12 {
13 this.btnInitEnv.Enabled = true;
14 return;
15 }
16
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 int i = 0;
20 bool flagFind = false;
21 StringBuilder sb = new StringBuilder();
22
23 while (true)
24 {
25 Thread.Sleep(300);
26 this.Invoke(new Action(() =>
27 {
28 sb.Append(this.textBoxOutPut.Text);
29 this.textBoxOutPut.Clear();
30 if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
31 {
32 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
33 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
34 "Entering recovery mode, starting command prompt, Stop.\r\n"));
35 this.labelStateInfo.ForeColor = Color.Red;
36 this.labelStateInfo.Text = "初始化失敗,請手動輸入命令初始化";
37 flagFind = true;
38 this.btnInitEnv.Enabled = true;
39 }
40 else if (sb.ToString().Contains(":-)"))
41 {
42 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
43 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
44 "進入操作模式成功\r\n"));
45 this.labelStateInfo.ForeColor = Color.Blue;
46 this.labelStateInfo.Text = "初始化成功";
47 flagFind = true;
48
49 //將業務按鈕使能
50 EnableBussinessButtons();
51 }
52 }));
53
54 if (flagFind || ++i > 20) //找開標志或10秒超時中斷
55 {
56 break;
57 }
58 }
59
60 if (!flagFind)
61 {
62 this.Invoke(new Action(() =>
63 {
64 this.textBoxOutPut.Clear();
65 this.labelStateInfo.ForeColor = Color.Red;
66 this.labelStateInfo.Text = "初始化失敗,超時";
67 this.btnInitEnv.Enabled = true;
68
69 DisableBussinessButtons();
70 }));
71 }
72 }));
73
74 thread.IsBackground = true;
75 thread.Start();
76 }
77 catch (Exception ex)
78 {
79 this.log.Write(ex.ToString());
80 }
81 }
2. 使用線程函數加action()
1 private void btnInitEnv_Click(object sender, EventArgs e)
2 {
3 //初始化環境時回顯出來的文字不讓看
4 try
5 {
6 this.textBoxOutPut.Clear();
7 this.btnInitEnv.Enabled = false;
8 this.labelStateInfo.Text = "";
9 this.labelStateInfo.ForeColor = Color.Red;
10
11 if (!WriteToSerialPort("diags"))
12 {
13 this.btnInitEnv.Enabled = true;
14 return;
15 }
16
17 Thread thread = new Thread(new ThreadStart(MonitorOutPutThread));
18
19 thread.IsBackground = true;
20 thread.Start();
21 }
22 catch (Exception ex)
23 {
24 this.log.Write(ex.ToString());
25 }
26 }
線程函數:
1 private void MonitorOutPutThread()
2 {
3 int i = 0;
4 bool flagFind = false;
5 StringBuilder sb = new StringBuilder();
6
7 while (true)
8 {
9 Thread.Sleep(300);
10 this.Invoke(new Action(() =>
11 {
12 sb.Append(this.textBoxOutPut.Text);
13 this.textBoxOutPut.Clear();
14 if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
15 {
16 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
17 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
18 "Entering recovery mode, starting command prompt, Stop.\r\n"));
19 this.labelStateInfo.ForeColor = Color.Red;
20 this.labelStateInfo.Text = "初始化失敗,請手動輸入命令初始化";
21 flagFind = true;
22 this.btnInitEnv.Enabled = true;
23 }
24 else if (sb.ToString().Contains(":-)"))
25 {
26 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
27 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
28 "進入操作模式成功\r\n"));
29 this.labelStateInfo.ForeColor = Color.Blue;
30 this.labelStateInfo.Text = "初始化成功";
31 flagFind = true;
32
33 //將業務按鈕使能
34 EnableBussinessButtons();
35 }
36 }));
37
38 if (flagFind || ++i > 20) //找開標志或10秒超時中斷
39 {
40 break;
41 }
42 }
43
44 if (!flagFind)
45 {
46 this.Invoke(new Action(() =>
47 {
48 this.textBoxOutPut.Clear();
49 this.labelStateInfo.ForeColor = Color.Red;
50 this.labelStateInfo.Text = "初始化失敗,超時";
51 this.btnInitEnv.Enabled = true;
52
53 DisableBussinessButtons();
54 }));
55 }
56 }
3. C#我在winform中做了兩個按鈕跟別對應兩個事件,我想實現點擊第一個按鈕觸發第一個事件,在第一
不需要多線程,推薦非同步調用。
4. 對界面編程來說c++的mfc,qt和c#的winform,wpf哪個應用多學哪個好
學QT必須要 容易上手 基於opengl的 可以做動畫 游戲哦。
.mfc太爛,不美觀,布局不好。運用復雜不穩定(只適合自己用)
公司要求好看。
c#的那個畢竟是c#的如果你只是做客戶端建議學C++DirectUI最次也要學QT
QQ 360這類的 都是基於DirectUI 2次開發的。 DUI比較難學。
以下是我最近剛用QT做的客戶端
5. c#winform多線程
一般在一些網路軟體方面需要多線程,單單是管理軟體什麼的不需要。
在網路軟體的話,需要有一個一直讀取數據的方法,需要讀取遠程發來的信息。
方法就是一個死循環。這里如果不用多線程的話,程序一打開就什麼也幹不了。開了多線程,那個線程就只會干讀取這件事,主線程就可以發消息干其他事,兩個線程不會相互影響。
6. c# 多線程編程的一個問題 winform
能的,在Form的構造函數裡面加上Form.=false;就可以了。
7. 請教C# WinForm編程高手,如何解決多界面耗時操作界面僵死的問題
BackGoundWorker 就是多線程,一般可以解決呀。
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new (worker_RunWorkerCompleted);
需要兩個方法,就是:
private void worker_DoWork(object sender, DoWorkEventArgs e)
用於處理需要做的工作,這個是在另一個線程中完成的
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
這個用於處理完成後,在界面中響應的操作。
界面卡死,就只能斷點檢查耗時在什麼地方啦。
8. winform窗體一個timer控制項同時控制兩個進程怎麼控制
可以幫改私信 可能涉及多線程