• 创建线程的几种方式(代码示例)



    #region 方式2-1 启动线程(带输入参数的)

    private void btn1_Click(object sender, EventArgs e)
    {
    MyObject obj = new MyObject(1, 2);//或者使用全局变量代替obj
    Thread thread = new Thread(obj.FunctionName);
    thread.Start();
    }

    public class MyObject
    {
    public int a1, b1;

    public MyObject(int a, int b)
    {
    a1 = a;
    b1 = b;
    }

    public void FunctionName()
    {
    MessageBox.Show("a:" + a1 + ",b:" + b1);
    }
    }
    #endregion

    #region 方式2-2 启动线程(带输入参数的)

    private void btn2_Click(object sender, EventArgs e)
    {
    //这个Thread类的构造方法的定义如下:
    Thread thread = new Thread(myStaticParamThreadMethod);
    thread.Start("通过委托的参数传值");
    }

    public static void myStaticParamThreadMethod(Object obj)
    {
    MessageBox.Show(obj.ToString());
    }

    //[ComVisibleAttribute(false)]
    //public delegate void ParameterizedThreadStart(Object obj);

    //public Thread(ParameterizedThreadStart start);

    #endregion


    #region 方式3 线程池技术

    RegisteredWaitHandle RW;

    private void btn3_Click(object sender, EventArgs e)
    {
    //ThreadPool.QueueUserWorkItem((objState) =>
    //{
    // //do something.. //from the thread pool.
    //}, null);

    RW = ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test), state, 1000, false);
    wait.Set();
    }

    AutoResetEvent wait = new AutoResetEvent(false);
    object state = new object();

    int count = 0;

    /// <summary>
    /// 会定时反复调用
    /// </summary>
    private void test(object state, bool timedOut)
    {
    SetText(DateTime.Now.ToString());
    count++;

    if (count > 5) RW.Unregister(wait);//执行5次后,退出
    }

    /// <summary>
    /// 调用UI线程,修改界面数据
    /// </summary>
    public void SetText(string argText)
    {
    if (lblResult.InvokeRequired)
    {
    lblResult.Invoke(new SetTextDelegateMethod(SetText), new[] { argText });
    }
    else
    lblResult.Text = argText;
    }
    public delegate void SetTextDelegateMethod(string argText);

    #endregion

    #region 方式4 使用BackgroundWorker

    //支持:报告进度、支持完成回调、取消任务、暂停任务等

    private BackgroundWorker Worker;

    private void btn4_Click(object sender, EventArgs e)
    {
    Worker = new BackgroundWorker();
    Worker.WorkerReportsProgress = true;
    Worker.WorkerSupportsCancellation = true;
    Worker.DoWork += worker_DoWork;
    Worker.ProgressChanged += worker_ProgressChanged;
    Worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    Worker.RunWorkerAsync();
    }

    /// <summary>
    /// 异步执行完毕,回到UI线程
    /// </summary>
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Cancelled) lblResult.Text = "取消成功!";
    else lblResult.Text = "执行完成!";

    ////测试捕获异常
    //if (e.Error != null && !string.IsNullOrEmpty(e.Error.Message)) lblResult.Text = e.Error.Message;

    //借助AsyncOperation.Post(SendOrPostCallback d, object arg),
    //在winform下使用这个函数,使得由SendOrPostCallback定义被封送回UI线程
    }

    private void btn4Abort_Click(object sender, EventArgs e)
    {
    Worker.CancelAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker _worker = sender as BackgroundWorker;
    for (int i = 1; i < 101; i++)
    {
    _worker.ReportProgress(i, "执行到第" + i + "个");
    Thread.Sleep(100);

    //此时在非UI线程中执行代码,执行下行代码会出错
    //lblResult.Text = "aaa"; //线程间操作无效: 从不是创建控件“lblResult”的线程访问它。

    //这里判断一下是否用户要求取消后台进行,并可以尽早退出
    if (_worker.CancellationPending)
    {
    e.Cancel = true;
    return;
    }

    ////测试捕获异常
    //if (i == 35) throw new Exception("在执行到i=" + i + "时候出错!");
    }
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    this.lblResult.Text = e.ProgressPercentage.ToString() + " " + e.UserState;
    }

    #endregion


    namespace WinFormsApp_CreateAThread
    {
    partial class Form1
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
    protected override void Dispose(bool disposing)
    {
    if (disposing && (components != null))
    {
    components.Dispose();
    }
    base.Dispose(disposing);
    }

    #region Windows 窗体设计器生成的代码

    /// <summary>
    /// 设计器支持所需的方法 - 不要
    /// 使用代码编辑器修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.btn1 = new System.Windows.Forms.Button();
    this.btn2 = new System.Windows.Forms.Button();
    this.btn3 = new System.Windows.Forms.Button();
    this.lblResult = new System.Windows.Forms.Label();
    this.btn4 = new System.Windows.Forms.Button();
    this.btn4Abort = new System.Windows.Forms.Button();
    this.SuspendLayout();
    //
    // btn1
    //
    this.btn1.Location = new System.Drawing.Point(24, 99);
    this.btn1.Name = "btn1";
    this.btn1.Size = new System.Drawing.Size(141, 44);
    this.btn1.TabIndex = 0;
    this.btn1.Text = "创建线程并带参数传值1";
    this.btn1.UseVisualStyleBackColor = true;
    this.btn1.Click += new System.EventHandler(this.btn1_Click);
    //
    // btn2
    //
    this.btn2.Location = new System.Drawing.Point(24, 174);
    this.btn2.Name = "btn2";
    this.btn2.Size = new System.Drawing.Size(141, 39);
    this.btn2.TabIndex = 1;
    this.btn2.Text = "创建线程并带参数传值2";
    this.btn2.UseVisualStyleBackColor = true;
    this.btn2.Click += new System.EventHandler(this.btn2_Click);
    //
    // btn3
    //
    this.btn3.Location = new System.Drawing.Point(211, 174);
    this.btn3.Name = "btn3";
    this.btn3.Size = new System.Drawing.Size(131, 39);
    this.btn3.TabIndex = 2;
    this.btn3.Text = "通过线程池创建线程3";
    this.btn3.UseVisualStyleBackColor = true;
    this.btn3.Click += new System.EventHandler(this.btn3_Click);
    //
    // lblResult
    //
    this.lblResult.AutoSize = true;
    this.lblResult.Location = new System.Drawing.Point(236, 115);
    this.lblResult.Name = "lblResult";
    this.lblResult.Size = new System.Drawing.Size(41, 12);
    this.lblResult.TabIndex = 3;
    this.lblResult.Text = "label1";
    //
    // btn4
    //
    this.btn4.Location = new System.Drawing.Point(211, 236);
    this.btn4.Name = "btn4";
    this.btn4.Size = new System.Drawing.Size(150, 44);
    this.btn4.TabIndex = 4;
    this.btn4.Text = "使用BackgroundWorker 4";
    this.btn4.UseVisualStyleBackColor = true;
    this.btn4.Click += new System.EventHandler(this.btn4_Click);
    //
    // btn4Abort
    //
    this.btn4Abort.Location = new System.Drawing.Point(211, 286);
    this.btn4Abort.Name = "btn4Abort";
    this.btn4Abort.Size = new System.Drawing.Size(150, 44);
    this.btn4Abort.TabIndex = 5;
    this.btn4Abort.Text = "4 取消当前操作";
    this.btn4Abort.UseVisualStyleBackColor = true;
    this.btn4Abort.Click += new System.EventHandler(this.btn4Abort_Click);
    //
    // Form1
    //
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(399, 339);
    this.Controls.Add(this.btn4Abort);
    this.Controls.Add(this.btn4);
    this.Controls.Add(this.lblResult);
    this.Controls.Add(this.btn3);
    this.Controls.Add(this.btn2);
    this.Controls.Add(this.btn1);
    this.Name = "Form1";
    this.Text = "Form1";
    this.ResumeLayout(false);
    this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.Button btn1;
    private System.Windows.Forms.Button btn2;
    private System.Windows.Forms.Button btn3;
    private System.Windows.Forms.Label lblResult;
    private System.Windows.Forms.Button btn4;
    private System.Windows.Forms.Button btn4Abort;
    }
    }


  • 相关阅读:
    Django的路由系统
    Django的View(视图)
    Django模板语言相关内容
    pip国内镜像
    TestNG 入门教程
    Spring MVC
    Git:代码冲突常见解决方法
    运行Maven项目时出现invalid LOC header (bad signature)错误,Tomcat不能正常启动
    annotation(@Retention@Target)详解
    JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
  • 原文地址:https://www.cnblogs.com/jx270/p/3583614.html
Copyright © 2020-2023  润新知