导航:首页 > 编程语言 > winform多线程编程

winform多线程编程

发布时间:2022-07-21 21:30:29

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控件同时控制两个进程怎么控制

可以帮改私信 可能涉及多线程

阅读全文

与winform多线程编程相关的资料

热点内容
单片机如何给电脑加密码 浏览:509
如何删掉多余的服务器 浏览:220
c编程算法 浏览:833
堵车如何缓解压力 浏览:17
喜鹊快贷app怎么了 浏览:263
海龟编辑器积木编程怎么安装 浏览:185
程序员理发店生意怎么样 浏览:603
程序员罗技 浏览:180
软考初级程序员课程2021下载 浏览:491
杭州程序员奶奶 浏览:880
不听命令造成错误 浏览:981
kool系统源码 浏览:610
流氓app在哪里看 浏览:98
域名购买了怎么指向服务器 浏览:121
安卓手机如何让照片颜色反转 浏览:859
怎么下载卓睿安手机版 浏览:514
h3crange命令 浏览:468
php前景和python 浏览:338
php压缩图片内存大小 浏览:495
在哪里可以查看云服务器的信息 浏览:70