我有一些代码,我需要运行在不同的线程,而不是GUI,因为它目前导致窗体冻结,而代码运行(10秒左右)。

假设我以前从未创建过一个新线程;有什么简单/基本的例子,如何做到这一点在c#和使用。net Framework 2.0或更高版本?


当前回答

如何:使用后台线程搜索文件

您必须非常小心从其他线程访问特定于GUI的东西(这对许多GUI工具包来说很常见)。如果你想在GUI中从处理线程中更新一些东西,检查这个答案,我认为这对WinForms很有用。对于WPF,看到这个(它展示了如何在UpdateProgress()方法中触摸组件,因此它将从其他线程工作,但实际上我不喜欢它在通过Dispathcer做BeginInvoke之前不做CheckAccess(),看到并搜索CheckAccess)

正在寻找。net专门关于线程的书,发现了这本(免费下载)。更多细节请参见http://www.albahari.com/threading/。

我相信你会发现你需要启动执行作为新线程在前20页,它有更多(不确定GUI特定片段,我的意思是严格特定于线程)。很高兴听到社区对这项工作的看法,因为我正在读这个。对我来说,现在看起来非常整洁(用于显示。net特定的线程方法和类型)。此外,它还涵盖了我真正欣赏的。net 2.0(而不是古老的1.1)。

其他回答

又快又脏,但很管用:

用于顶部:

using System.Threading;

简单的代码:

static void Main( string[] args )
{
    Thread t = new Thread( NewThread );
    t.Start();
}

static void NewThread()
{
    //code goes here
}

我只是将其放入一个新的控制台应用程序中作为示例

我建议参考Jeff Richter的Power Threading Library,特别是IAsyncEnumerator。看看查理·卡尔弗特博客上的视频,里希特对它有一个很好的概述。

不要被这个名字吓倒,因为它使异步编程任务更容易编码。

如果你想得到一个值:

var someValue;

Thread thread = new Thread(delegate()
            {                 
                //Do somthing and set your value
                someValue = "Hello World";
            });

thread.Start();

while (thread.IsAlive)
  Application.DoEvents();

另一种选择,使用委托和线程池…

假设'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);

ThreadPool。QueueUserWorkItem对于简单的东西来说是非常理想的。唯一需要注意的是从另一个线程访问控件。

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    DoSomethingThatDoesntInvolveAControl();
}, null);