关于C#线程编程异步执行提问

fightrage 2017-09-04 11:01:46
本人C#萌新,
关于线程提问,首先环境是在窗体中编程,现在我的线程为一个组
public Thread[] pro = new Thread[30];
跟随了一个信息组
 proinformation[] proin = new proinformation[30];

信息组格式为
public class proinformation
{
public proinformation(){}
public proinformation(string mname, int mtime, int mprior)
{
this.name = mname;
this.time = mtime;
this.prior = mprior;
}
public string name;
public int time;
public int prior;
public delegate void ProcessDelegate(); //启用委托

public void statusbackshowstart()
{
string time = DateTime.Now.ToLongTimeString().ToString();
time = "[" + time + "]";
windows.form1.temp.Text = windows.form1.Text + time + "进程" + name + "启动\n";
}
public void statusbackshowfinish()
{
string time = DateTime.Now.ToLongTimeString().ToString();
time = "[" + time + "]";
windows.form1.temp.Text = windows.form1.Text + time + "进程" + name + "结束\n";
}

public void Threadbuild()//进程执行函数
{
ProcessDelegate showProcess1 = new ProcessDelegate(statusbackshowstart);
ProcessDelegate showProcess2 = new ProcessDelegate(statusbackshowfinish);
if (windows.form1.temp.IsHandleCreated) { windows.form1.temp.Invoke(showProcess1); }
Thread.Sleep(time * 100);
if (windows.form1.temp.IsHandleCreated) { windows.form1.temp.Invoke(showProcess2); }
}
}

提问:
1.现在我想在框体类中实现按顺序调用线程,例如先执行pro[0],执行完毕后执行pro[1],请问我应该如何使用什么函数,怎样写代码?
2.我为实现上述功能,在信息中增加了bool finish变量,即
 public void Threadbuild()//进程执行函数
{
finish = false;
ProcessDelegate showProcess1 = new ProcessDelegate(statusbackshowstart);
ProcessDelegate showProcess2 = new ProcessDelegate(statusbackshowfinish);
if (windows.form1.temp.IsHandleCreated) { windows.form1.temp.Invoke(showProcess1); }
Thread.Sleep(time * 100);
if (windows.form1.temp.IsHandleCreated) { windows.form1.temp.Invoke(showProcess2); }
finish = true;
}

然后框体中我写的代码是
【例如先执行pro[0]再执行pro[1]】
pro[0].Start();
while(proin[0].finish==false){}
pro[1].Start();

在运行时会使窗体死,请问是什么原因?(萌新虚心求教)
...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fightrage 2017-09-04
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
传入当前序号,并设置一个全局的工作序号变量 在线程里检查传入的序号是否与全局量一致,若非则等待
感谢回答,对于你的回答我有几个问题,可以的话请解答一下: 1.由于我是窗体显示,整体目前分为两个PUBLIC类,即Form和proinformation,我应该如何设置一个全局的可传参工作变量? (萌新,不要介意,在我印象里C#不存在全局变量,要实现类似全面变量的功能,只有新建类和类中静态变量,然而前者由于没有实例化似乎无法传参,后者不可更改) 2.请问在线程执行函数中如何实现等待,是否可以用while()+break语句书写?
xuzuning 2017-09-04
  • 打赏
  • 举报
回复
传入当前序号,并设置一个全局的工作序号变量 在线程里检查传入的序号是否与全局量一致,若非则等待
fightrage 2017-09-04
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
[quote=引用 楼主 m0_37789836 的回复:] 提问: 1.现在我想在框体类中实现按顺序调用线程,例如先执行pro[0],执行完毕后执行pro[1],请问我应该如何使用什么函数,怎样写代码?
按顺序调用委托方法即可。既然是“调用”问题,不要就接到线程这么高大上的概念。 受调用的就应该是委托的概念职责,不是什么线程。[/quote] 首先感谢提醒,我很清楚这点,但是我们的要求使用线程模拟进程实现进程调度,所以必须使用Thread或者Task,我个人对Task掌握极其不好,所以这里用的Thread
  • 打赏
  • 举报
回复
引用 2 楼 m0_37789836 的回复:
刚刚试过了,确实只要一个线程就够了,但是这样无法完成异步,比如我依次创建3个进程,他们会几乎同时运行而不是依次运行
你不要求并发,就不要纠结到线程概念。
  • 打赏
  • 举报
回复
引用 楼主 m0_37789836 的回复:
提问: 1.现在我想在框体类中实现按顺序调用线程,例如先执行pro[0],执行完毕后执行pro[1],请问我应该如何使用什么函数,怎样写代码?
按顺序调用委托方法即可。既然是“调用”问题,不要就接到线程这么高大上的概念。 受调用的就应该是委托的概念职责,不是什么线程。
fightrage 2017-09-04
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
[quote=引用 楼主 m0_37789836 的回复:] 先执行pro[0],执行完毕后执行pro[1]
既然这样的逻辑,只要1个线程就可以了,线程里依次执行两个方法[/quote] 刚刚试过了,确实只要一个线程就够了,但是这样无法完成异步,比如我依次创建3个进程,他们会几乎同时运行而不是依次运行
xdashewan 2017-09-04
  • 打赏
  • 举报
回复
引用 楼主 m0_37789836 的回复:
先执行pro[0],执行完毕后执行pro[1]
既然这样的逻辑,只要1个线程就可以了,线程里依次执行两个方法
fightrage 2017-09-04
  • 打赏
  • 举报
回复
感谢各位,最后问题用异步async和信号量解决了,然而产生其他问题,我将另外发一个帖子询问,感谢各位的帮助!
VagGrant 2017-09-04
  • 打赏
  • 举报
回复
1、例如: ProcessDelegate showProcess1 = new ProcessDelegate(statusbackshowstart); 然后 showProcess1.BeginInvoke()。参数中有回调 然后在回调中 执行showProcess2.这样就既是异步 又是顺序执行了 2、其实task很简单。 Task.Factory.start( '' 这里进行异步第一个操作 " ).Continue(“这里就是在第一个异步操作结束后才会执行第二个异步操作” ) 3、也可以学习下await 那么异步看起来就和同步没什么区别了
xuzuning 2017-09-04
  • 打赏
  • 举报
回复
类属性对于类方法就是全局的 全局的类的全局静态属性,对于任何类的任何方法都是全局的

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧