110,529
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
public delegate void InvokeDelegate();
private void Invoke_Click(object sender)
{
textBox1.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
Thread.Sleep(16000);
textBox1.Text = "Executed the given delegate";
}
public Form1()
{
InitializeComponent();
var thread = new Thread(new ParameterizedThreadStart(Invoke_Click), 2048000);
thread.Start();
}
}
private void Invoke_Click(object sender)
{
Thread.Sleep(16000);
textBox1.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
textBox1.Text = "Executed the given delegate";
}
但是实际上滥用线程实在是没有必要。Timer是操作系统的中断控制的,是高效率的机制,触发事件之前只需要注册而不需要占用任何线程,不是你的线程可比的。
public class MyForm : System.Windows.Forms.Form {
//UI 元素
private Label lblStatus;
private ProgressBar progressBar1;
//Delegate
private delegate void MyProgressEventsHandler(
object sender, MyProgressEvents e);
private void UpdateUI(object sender, MyProgressEvents e) {
lblStatus.Text = e.Msg;
myProgressControl.Value = e.PercentDone;
}
//ShowProgress 现在可以记录为可从任何线程调用的公共方法。
public void ShowProgress(string msg, int percentDone)
{
if(InvokeRequired)
{
System.EventArgs e = new MyProgressEvents(msg, percentDone);
object[] pList = { this, e };
BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
}
else
{
UpdateUI(this, new MyProgressEvents(msg,
PercentDone));
}
}
private void btnStart_Click(object sender, EventArgs e)
{
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
t.IsBackground = true;
t.Start(input);
}
//线程执行函数
private void RunsOnWorkerThread()
{
int i = 0;
while(...) //loop
{
DoSomethingSlow();
ShowProgress("test",i);
++i;
}
}
}
这个例子没有用匿名函数和lambda表达式,好理解些