110,537
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
Thread thread;
public Form1()
{
InitializeComponent();
}
private void btnTest_Click(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(DoWork));
thread.Start();
//......
txtMsg.Text = "完成";
}
void DoWork()
{
SetText("线程运了。");
}
delegate void SetTextHandler(string msg);
private void SetText(string msg)
{
if (txtMsg.InvokeRequired)
{
SetTextHandler d = new SetTextHandler(SetText);
object val = (object)msg;
this.Invoke(d, val);
}
else
{
txtMsg.Text += "\r\n" + msg;
}
}
}
using(fastCSharp.threading.task task = new fastCSharp.threading.task(2))
{
task.Add(DoWork);
task.Add(DoWork);
}
InvokeText("完成");
fastCSharp.threading.task task = new fastCSharp.threading.task(2);//非UI线程任务,最大并行2线程
task.Add(DoWork);
task.Add(DoWork);
uiWait = new uiWait(task);
//第一种UI线程方式,这里应该使用第一种
uiWait.Wait();
//第二种子线程方式,非UI类似同步需求扩展
uiWait.RunThread();
//do something
uiWait.WaitThread();
txtMsg.Text = "完成";
void DoWork()
{
//第一种同步模式
uiWait.AddWait(() => txtMsg.Text = "线程开始了。");
//do something
uiWait.AddWait(() => txtMsg.Text = "线程结束了。");
//第一种异步模式
uiWait.Add(() => txtMsg.Text = "线程开始了。");
//do something
uiWait.Add(() => txtMsg.Text = "线程结束了。");
}
void SetText(string msg)
{
if (txtMsg.InvokeRequired)
{
SetTextHanlder d = new SetTextHanlder(SetText);
object o = (object)msg;
this.Invoke(d, msg);
}
else
{
txtMsg.Text = msg + "\r\n" + txtMsg.Text;
}
}
private void InvokeText(string msg)
{
txtMsg.Invoke(new SetTextHanlder(SetText), new object[] { obj });
}
private void SetText(string msg)
{
txtMsg.Text = "\r\n" + msg + txtMsg.Text;
}
其实我已经有角决方案了。
如果有高手看到的话请继续探讨。
现在的做法就中在Test()调用时采用一个线程调用,
之前的Join . WaitHandle.WaitAll两方案都可以完美运行。
Thread thread = new Thread(new ThreadStart(Test));
thread.Start();
其它 sbwwkmyd提供的完整便跟第二个例差不多,
区别就是 SetText 分开写,还有就是 Invoke 采用一异步也就是BeginInvoke
UI假死和顺序不对他这个程序的缺点。
private event Action Run;
private void btnTest_Click(object sender, EventArgs e)
{
Task task = new Task(() =>
{
Run += () =>
{
txtMsg.Text = "线程开始运行了";
Thread.Sleep(3000);
};
});
task.Start();
task.Wait();
Run += () =>
{
txtMsg.Text = "线程运行完成";
};
Run();
}
UI的设计果然是很神奇的东东