为了账号安全,请及时绑定邮箱和手机立即绑定

如何在新线程中运行一些简单的代码?

如何在新线程中运行一些简单的代码?

慕莱坞森 2019-10-05 10:50:38
我有一些代码需要在不同于GUI的线程中运行,因为它当前导致表单在代码运行(约10秒左右)时冻结。假设我以前从未创建过新线程;在C#中以及如何使用.NET Framework 2.0或更高版本的简单/基本示例是什么?
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

乔·阿尔巴哈里(Joe Albahari)是开始阅读的好地方。


如果要创建自己的线程,这很简单:


using System.Threading;

new Thread(() => 

{

    Thread.CurrentThread.IsBackground = true; 

    /* run your code here */ 

    Console.WriteLine("Hello, world"); 

}).Start();


查看完整回答
反对 回复 2019-10-05
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

BackgroundWorker 似乎是您的最佳选择。


这是我的最小示例。单击按钮后,后台工作人员将开始在后台线程中工作,并同时报告其进度。工作完成后还将报告。


using System.ComponentModel;

...

    private void button1_Click(object sender, EventArgs e)

    {

        BackgroundWorker bw = new BackgroundWorker();


        // this allows our worker to report progress during work

        bw.WorkerReportsProgress = true;


        // what to do in the background thread

        bw.DoWork += new DoWorkEventHandler(

        delegate(object o, DoWorkEventArgs args)

        {

            BackgroundWorker b = o as BackgroundWorker;


            // do some simple processing for 10 seconds

            for (int i = 1; i <= 10; i++)

            {

                // report the progress in percent

                b.ReportProgress(i * 10);

                Thread.Sleep(1000);

            }


        });


        // what to do when progress changed (update the progress bar for example)

        bw.ProgressChanged += new ProgressChangedEventHandler(

        delegate(object o, ProgressChangedEventArgs args)

        {

            label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);

        });


        // what to do when worker completes its task (notify the user)

        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(

        delegate(object o, RunWorkerCompletedEventArgs args)

        {

            label1.Text = "Finished!";

        });


        bw.RunWorkerAsync();

    }

注意:


为了简单起见,我使用C#的匿名方法将所有内容放在单个方法中,但是您始终可以将它们拉到其他方法中。

在ProgressChanged或  RunWorkerCompleted处理程序中更新GUI是安全的 。但是,从更新GUI DoWork 将导致  InvalidOperationException。


查看完整回答
反对 回复 2019-10-05
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

快速又肮脏,但是可以使用:


在顶部使用:


using System.Threading;

简单的代码:


static void Main( string[] args )

{

    Thread t = new Thread( NewThread );

    t.Start();

}


static void NewThread()

{

    //code goes here

}

我只是把它扔到一个新的控制台应用程序中

查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 507 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信