日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

同步,异步,多线程,你怎么看?

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同步,异步,多线程,你怎么看? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
同步,異步,多線程,你怎么看? 原文:同步,異步,多線程,你怎么看?[原創]

  講解同步與異步的帖子多如牛毛,個人的理解,簡單地說同步就是串行,異步就是并行。同步的情況下,A調用B,A等B執行完成后接著執行,自始至終只有一個線程在運行;而異步時,A調用B,B執行,A也繼續執行,這個過程中有兩個線程在運行。本文通過winform下的一個實例講解同步與異步的差別,本文的例子很簡單,適合初學者。

  1.同步

  大家應該經常碰到這種情況,點擊界面上某個按鈕或者某個控件后界面卡死的情況,個人覺得其中一個原因可能是主線程的問題,界面主線程在后臺處理其他任務,沒法同時響應用戶的操作。看一個最簡單的例子,界面如下:

  

代碼:

private void btnCalc_Click(object sender, EventArgs e) ???????

{ ???????????

   int sum = Calc(100); ???????????

  rtxtMain.Text = "calc over, result is " + sum; ???????????

  MessageBox.Show("計算完成", "提示"); ???????

}

??????? private int Calc(int n) ???????

{ ???????????

  int sum = 0; ???????????

  Thread.Sleep(TimeSpan.FromSeconds(20)); ???????????

  for (int i = 0; i < n; i++) ???????????

  { ???????????????

    sum += i; ???????????

  } ???????????

  return sum; ???????

}

  很明顯,使用這種方法時點擊按鈕后界面就卡住,直到后臺方法執行完才響應。原因是只有主線程在運行,那么咱們再重新起一個新線程,可以自己另起一個線程,或者使用.NET提供的異步方法。

?

  2.異步

  .NET異步時重新從線程池中啟動了一個線程,本例中這個線程負責執行后臺的方法,界面主線程繼續響應用戶的操作。線程池線程執行完后臺方法后彈出提示框提示主線程工作已做完。代碼如下:

  

  

  public delegate int CalcEventHandler(int n);???? //定義委托

??? public partial class MainFrm : Form ???

  { ???????

    public MainFrm() ???????

     { ???????????

      InitializeComponent(); ???????????

      Control.CheckForIllegalCrossThreadCalls = false;????????? //禁用非法跨線程調用檢查

    }

???????   private void btnCalc_Click(object sender, EventArgs e) ???????

    { ???????????

      CalcEventHandler mycalc = new CalcEventHandler(Calc); ???????????

      AsyncCallback async = new AsyncCallback(OnComplete);???????????? //回調方法

      mycalc.BeginInvoke(100, async, "this is your data" );????????????????? //執行異步

    }

??????? private int Calc(int n) ???????

    { ???????????

      int sum = 0; ???????????

      Thread.Sleep(TimeSpan.FromSeconds(20)); ???????????

      for (int i = 0; i < n; i++) ???????????

      { ???????????????

        sum += i; ???????????

      } ???????????

      return sum; ???????

    }

   //異步完成后執行的回調方法

??????? private void OnComplete(IAsyncResult asycResult) ???????

   { ???????????

    AsyncResult result = (AsyncResult)asycResult; ???????????

    CalcEventHandler del = (CalcEventHandler)result.AsyncDelegate;??????//向下轉換??????

    int sum = del.EndInvoke(asycResult);?????//獲取返回值???????????

    string data = result.AsyncState != null ? result.AsyncState.ToString() : string.Empty;???????????//獲取傳遞的數據

?    rtxtMain.Text = "calc over, 結果為 " + sum + ", 傳遞信息為 " + data; ???????????

    MessageBox.Show("計算完成","提示");?????????//提示主線程

  } ???

}

結果如下:

  這樣,界面不會出現卡死的情況,可以提高用戶體驗。當然這只是一個簡單的例子。

?

  還有一種方法就是,自己另外啟一個線程,代碼如下:

  private void btnCalc_Click(object sender, EventArgs e) ???????

  {??????????????

    Thread tr = new Thread(new ThreadStart(Calc));???????//啟動新線程??????

    tr.Start(); ???????

  }

??????? private void Calc()??????//重載方法???

  { ???????????

    Calc(100); ???????

  }

???????

  private int Calc(int n) ???????

  { ???????????

    int sum = 0; ???????????

    Thread.Sleep(TimeSpan.FromSeconds(5)); ???????????

    for (int i = 0; i < n; i++) ???????????

    { ???????????????

      sum += i; ???????????

    } ???????????

    rtxtMain.Text = "calc over, 結果為 " + sum;???????????? //提示移到這里

    MessageBox.Show("計算完成", "提示"); ??????????

  ? return sum; ???????

  }

?

?

小結:

  1.這個例子很簡單,用于了解同步和異步的區別和作用。

?  2.同步和異步跟為委托和多線程是相關聯的,有興趣的朋友繼續學習委托和多線程相關知識。

?

本文寫的很簡單,謝謝你的閱讀,如果有好的建議或方法,歡迎留言,一起交流~~

?

?

?

?

?

posted on 2014-03-14 15:27 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/3600676.html

總結

以上是生活随笔為你收集整理的同步,异步,多线程,你怎么看?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。