我有一些代码,我需要运行在不同的线程,而不是GUI,因为它目前导致窗体冻结,而代码运行(10秒左右)。
假设我以前从未创建过一个新线程;有什么简单/基本的例子,如何做到这一点在c#和使用。net Framework 2.0或更高版本?
我有一些代码,我需要运行在不同的线程,而不是GUI,因为它目前导致窗体冻结,而代码运行(10秒左右)。
假设我以前从未创建过一个新线程;有什么简单/基本的例子,如何做到这一点在c#和使用。net Framework 2.0或更高版本?
当前回答
另一种选择,使用委托和线程池…
假设'GetEnergyUsage'是一个方法,它接受一个DateTime和另一个DateTime作为输入参数,并返回一个Int…
// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime,
DateTime procDateTime);
// following inside of some client method
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);
其他回答
将该代码放入一个函数中(不能与GUI在同一个线程上执行的代码),并执行以下代码来触发该代码的执行。
线程myThread=新线程(namefunction);
workerThread.Start();
在线程对象上调用start函数将导致在新线程中执行函数调用。
尝试使用BackgroundWorker类。您为它指定要运行的内容,并在工作完成时通知它。在我链接到的MSDN页面上有一个例子。
我建议参考Jeff Richter的Power Threading Library,特别是IAsyncEnumerator。看看查理·卡尔弗特博客上的视频,里希特对它有一个很好的概述。
不要被这个名字吓倒,因为它使异步编程任务更容易编码。
这里如何使用线程和一个progressBar,这只是为了理解线程是如何工作的,在表单中有三个progressBar和4个按钮:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread t, t2, t3;
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
t = new Thread(birinicBar); //evry thread workes with a new progressBar
t2 = new Thread(ikinciBar);
t3 = new Thread(ucuncuBar);
}
public void birinicBar() //to make progressBar work
{
for (int i = 0; i < 100; i++) {
progressBar1.Value++;
Thread.Sleep(100); // this progressBar gonna work faster
}
}
public void ikinciBar()
{
for (int i = 0; i < 100; i++)
{
progressBar2.Value++;
Thread.Sleep(200);
}
}
public void ucuncuBar()
{
for (int i = 0; i < 100; i++)
{
progressBar3.Value++;
Thread.Sleep(300);
}
}
private void button1_Click(object sender, EventArgs e) //that button to start the threads
{
t.Start();
t2.Start(); t3.Start();
}
private void button4_Click(object sender, EventArgs e)//that button to stup the threads with the progressBar
{
t.Suspend();
t2.Suspend();
t3.Suspend();
}
private void button2_Click(object sender, EventArgs e)// that is for contuniue after stuping
{
t.Resume();
t2.Resume();
t3.Resume();
}
private void button3_Click(object sender, EventArgs e) // finally with that button you can remove all of the threads
{
t.Abort();
t2.Abort();
t3.Abort();
}
}
如何:使用后台线程搜索文件
您必须非常小心从其他线程访问特定于GUI的东西(这对许多GUI工具包来说很常见)。如果你想在GUI中从处理线程中更新一些东西,检查这个答案,我认为这对WinForms很有用。对于WPF,看到这个(它展示了如何在UpdateProgress()方法中触摸组件,因此它将从其他线程工作,但实际上我不喜欢它在通过Dispathcer做BeginInvoke之前不做CheckAccess(),看到并搜索CheckAccess)
正在寻找。net专门关于线程的书,发现了这本(免费下载)。更多细节请参见http://www.albahari.com/threading/。
我相信你会发现你需要启动执行作为新线程在前20页,它有更多(不确定GUI特定片段,我的意思是严格特定于线程)。很高兴听到社区对这项工作的看法,因为我正在读这个。对我来说,现在看起来非常整洁(用于显示。net特定的线程方法和类型)。此外,它还涵盖了我真正欣赏的。net 2.0(而不是古老的1.1)。