麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

C#中事件與線程的應用

2023-05-17 11:42:00
字體:
來源:轉載
供稿:網友

我們知道,如果按鈕事件中需要啟動線程,但線程所調用的方法默認是不帶參數,不帶返回值的,如果需要調用的方法我就TNND想帶參數,帶返回值,怎么做?我寫了例子。

界面:

要實現個簡單功能,輸入數字1,數字2,當按sum按鈕時,做一個從數字1到數字2的累加,然后彈出消息框顯示最后結果。

分析:考慮到軟件實用,做累加運算應該單獨開出一個線程來做,這個程序比較簡單,但如果運算量很大,點擊按鈕時程序便會處于“假死”狀態,動不了,(跟360查惡意軟件似的),繼續分析,如果單獨開辟線程來做,那線程所調用的方法必須有兩個參數(long num1,long num2),而且需要將結果返回給主窗體以便彈出窗口顯示結果,帶參數比較好解決了,新建一個類,將兩個參數做為類成員,并且在構造函數中接收這兩個變量,但返回值要如何獲得呢?大多數人會舉一反三,參數既然可以如此,那返回值不也是一個道理么?設置第三個類成員儲存結果,運算完畢后將值賦給這個變量即可,我們這樣寫這個類:

using System;
using System.Collections.Generic;
using System.Text;


class Num
{
        private long num1=0;
        private long num2=0;
        private long totalSum=0;
        public Num(long _num1, long _num2)
        {
            num1 = _num1;
            num2 = _num2;
        }
        public void sum()
        {
            for (long i = num1; i <= num2; i++)
            {
                totalSum += i;              
                 

        }

}
主窗體的代碼我們這么寫:

public partial class Form1 : Form

{
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSum_Click(object sender, EventArgs e)
        {
            long num1 = long.Parse(txtNum1.Text);
            long num2 = long.Parse(txtNum2.Text);
            Num num = new Num(num1, num2);
            Thread thread = new Thread(new ThreadStart(num.sum));
            thread.Start();

            MessageBox.Show(num.totalSum.ToString());
        }

}

     當我們真這么做時,發現這個結果一輩子都是0,原因相信大家猜到了,當線程啟動時,代碼是會繼續運行的,所以當我們取值的時候,線程根本尚未開始運算,我們取的是變量的默認值0,怎么解決這個問題,這就用到了事件,Num類代碼改進如下:

using System;
using System.Collections.Generic;
using System.Text;

   

public delegate void delegateMe(long total);
    class Num
    {
        private long num1;
        private long num2;
        private long totalSum=0;
        public event delegateMe eventMe;
        public Num(long _num1, long _num2)
        {
            num1 = _num1;
            num2 = _num2;
        }
        public void sum()
        {
            for (long i = num1; i <= num2; i++)
            {
                totalSum += i;              
            }
            eventMe(totalSum);//觸發事件
        }
}

     這樣我們可以在for循環結束后,觸發事件,并且將結果返回,相應主窗口代碼改進如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;


public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSum_Click(object sender, EventArgs e)
        {
            long num1 = long.Parse(txtNum1.Text);
            long num2 = long.Parse(txtNum2.Text);
            Num num = new Num(num1, num2);
            num.eventMe += new delegateMe(num_eventMe);
            Thread thread = new Thread(new ThreadStart(num.sum));
            thread.Start();
        }

        void num_eventMe(long total)
        {
            MessageBox.Show(total.ToString());
        }
}

     這樣一來問題就解決了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲成a人在线 | 经典三级在线视频 | 欧美黄色免费视频 | 毛片在哪里看 | 91成人精品 | 午夜视频在线观看91 | 久久久成人动漫 | xnxx18日本| 欧美国产精品一区二区 | 国产亚洲精品久久久久久网站 | 免费在线观看国产精品 | wwwxxx免费视频 | 99re久久最新地址获取 | 在线观看中文字幕av | 97视频| 精品国产91久久久久久浪潮蜜月 | 国产电影精品久久 | 精品国产一区二区三区在线观看 | 免费国产成人高清在线看软件 | jizzzzxxxxx| 在线观看中文字幕av | 亚洲国产网站 | 日本在线不卡一区二区 | 91成人影库| 国产精品亚洲一区二区三区久久 | 羞羞的视频免费在线观看 | 亚洲人成免费 | 精品国产一区二区三区在线观看 | av在线免费观看不卡 | 国产亚洲欧美日韩高清 | 成人毛片一区 | 污视频在线免费播放 | 国产欧美亚洲精品a | 黄色免费不卡视频 | 欧美日韩一区二区综合 | 一区二区久久久久草草 | 国语自产免费精品视频在 | 在线播放亚洲精品 | 亚洲国产高清一区 | 亚洲第一色片 | 国产毛片毛片 |