青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cc

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  38 隨筆 :: 14 文章 :: 21 評論 :: 0 Trackbacks
問題的產生:

  我的WinForm程序中有一個用于更新主窗口的工作線程(worker thread),但文檔中卻提示我不能在多線程中調用這個form(為什么?),而事實上我在調用時程序常常會崩掉。請問如何從多線程中調用form中的方法呢?

  解答:

  每一個從Control類中派生出來的WinForm類(包括Control類)都是依靠底層Windows消息和一個消息泵循環(message pump loop)來執行的。消息循環都必須有一個相對應的線程,因為發送到一個window的消息實際上只會被發送到創建該window的線程中去。其結果是,即使提供了同步(synchronization),你也無法從多線程中調用這些處理消息的方法。大多數plumbing是掩藏起來的,因為WinForm是用代理(delegate)將消息綁定到事件處理方法中的。WinForm將Windows消息轉換為一個基于代理的事件,但你還是必須注意,由于最初消息循環的緣故,只有創建該form的線程才能調用其事件處理方法。如果你在你自己的線程中調用這些方法,則它們會在該線程中處理事件,而不是在指定的線程中進行處理。你可以從任何線程中調用任何不屬于消息處理的方法。

  Control類(及其派生類)實現了一個定義在System.ComponentModel命名空間下的接口 -- ISynchronizeInvoke,并以此來處理多線程中調用消息處理方法的問題:

public interface ISynchronizeInvoke
{
 object Invoke(Delegate method,object[] args);
 IAsyncResult BeginInvoke(Delegate method,object[] args);
 object EndInvoke(IAsyncResult result);
 bool InvokeRequired {get;}
}

  ISynchronizeInvoke提供了一個普通的標準機制用于在其他線程的對象中進行方法調用。例如,如果一個對象實現了ISynchronizeInvoke,那么在線程T1上的客戶端可以在該對象中調用ISynchronizeInvoke的Invoke()方法。Invoke()方法的實現會阻塞(block)該線程的調用,它將調用打包發送(marshal)到 T2,并在T2中執行調用,再將返回值發送會T1,然后返回到T1的客戶端。Invoke()方法以一個代理來定位該方法在T2中的調用,并以一個普通的對象數組做為其參數。

  調用者還可以檢查InvokeRequired屬性,因為你既可以在同一線程中調用ISynchronizeInvoke也可以將它重新定位(redirect)到其他線程中去。如果InvokeRequired的返回值是false的話,則調用者可以直接調用該對象的方法。

  比如,假設你想要從另一個線程中調用某個form中的Close方法,那么你可以使用預先定義好的的MethodInvoker代理,并調用Invoke方法:

Form form;
/* obtain a reference to the form,
then: */
ISynchronizeInvoke synchronizer;
synchronizer = form;

if(synchronizer.InvokeRequired)
{
MethodInvoker invoker = new
MethodInvoker(form.Close);
synchronizer.Invoke(invoker,null);
}
else
form.Close();

  ISynchronizeInvoke不僅僅用于WinForm中。例如,一個Calculator類提供了將兩個數字相加的Add()方法,它就是通過ISynchronizeInvoke來實現的。用戶必須確定ISynchronizeInvoke.Invoke()方法的調用是執行在正確的線程中的。

  C# 在正確的線程中寫入調用

  列表A. Calculator類的Add()方法用于將兩個數字相加。如果用戶直接調用Add()方法,它會在該用戶的線程中執行調用,而用戶可以通過ISynchronizeInvoke.Invoke()將調用寫入正確的線程中。

  列表A:

public class Calculator : ISynchronizeInvoke
{
 public int Add(int arg1,int arg2)
 { 
  int threadID = Thread.CurrentThread.GetHashCode();
  Trace.WriteLine( "Calculator thread ID is " + threadID.ToString());
  return arg1 + arg2;
 }
 //ISynchronizeInvoke implementation
 public object Invoke(Delegate method,object[] args)
 {
  public IAsyncResult BeginInvoke(Delegate method,object[] args)
  {
   public object EndInvoke(IAsyncResult result)
   {
    public bool InvokeRequired
    {
    }
   }
   //Client-side code
   public delegate int AddDelegate(int arg1,int arg2);

    int threadID = Thread.CurrentThread.GetHashCode();
    Trace.WriteLine("Client thread ID is " + threadID.ToString());

    Calculator calc;
    /* Some code to initialize calc */

    AddDelegate addDelegate = new AddDelegate(calc.Add);

    object[] arr = new object[2];
    arr[0] = 3;
    arr[1] = 4;

    int sum = 0;
    sum = (int) calc.Invoke(addDelegate,arr);
    Debug.Assert(sum ==7);

    /* Possible output:
    Calculator thread ID is 29
    Client thread ID is 30
    */

  或許你并不想進行同步調用,因為它被打包發送到另一個線程中去了。你可以通過BeginInvoke()和EndInvoke()方法來實現它。你可以依照通用的.NET非同步編程模式(asynchronous programming model)來使用這些方法:用BeginInvoke()來發送調用,用EndInvoke()來實現等待或用于在完成時進行提示以及收集返回結果。

  還值得一提的是ISynchronizeInvoke方法并非安全類型。 類型不符會導致在執行時被拋出異常,而不是編譯錯誤。所以在使用ISynchronizeInvoke時要格外注意,因為編輯器無法檢查出執行錯誤。

  實現ISynchronizeInvoke要求你使用一個代理來在后期綁定(late binding)中動態地調用方法。每一種代理類型均提供DynamicInvoke()方法: public object DynamicInvoke(object[]
args);

  理論上來說,你必須將一個方法代理放到一個需要提供對象運行的真實的線程中去,并使Invoke() 和BeginInvoke()方法中的代理中調用DynamicInvoke()方法。ISynchronizeInvoke的實現是一個非同一般的編程技巧,本文附帶的源文件中包含了一個名為Synchronizer的幫助類(helper class)和一個測試程序,這個測試程序是用來論證列表A中的Calculator類是如何用Synchronizer類來實現ISynchronizeInvoke的。Synchronizer是ISynchronizeInvoke的一個普通實現,你可以使用它的派生類或者將其本身作為一個對象來使用,并將ISynchronizeInvoke實現指派給它。

  用來實現Synchronizer的一個重要元素是使用一個名為WorkerThread的嵌套類(nested class)。WorkerThread中有一個工作項目(work item)查詢。WorkItem類中包含方法代理和參數。Invoke()和BeginInvoke()用來將一個工作項目實例加入到查詢里。WorkerThread新建一個.NET worker線程,它負責監測工作項目的查詢任務。查詢到項目之后,worker會讀取它們,然后調用DynamicInvoke()方法。

posted on 2006-12-07 14:37 醒目西西 閱讀(623) 評論(0)  編輯 收藏 引用 所屬分類: 編程相關
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品一区=区| 小黄鸭精品aⅴ导航网站入口| 日韩午夜在线视频| 欧美国产1区2区| 亚洲欧美清纯在线制服| 亚洲精品在线视频| 中文国产成人精品| 亚洲主播在线| 久久久无码精品亚洲日韩按摩| 久久久久久网| 亚洲国产日韩一区二区| 亚洲另类视频| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲精品一区二区三区樱花 | 狠狠色狠狠色综合系列| 亚洲福利专区| 亚洲午夜精品视频| 久久久综合网| 亚洲伦理在线| 久久久久欧美| 国产精品毛片a∨一区二区三区| 国产午夜精品久久久久久久| 亚洲国产人成综合网站| 午夜精品美女自拍福到在线| 免费成人在线观看视频| 一本一本久久a久久精品综合妖精| 欧美一区2区三区4区公司二百| 免费日韩av| 国产欧美一区二区精品性色| 亚洲另类自拍| 欧美电影免费观看大全| 午夜在线一区| 欧美日韩另类丝袜其他| 一区二区三区在线视频播放| 亚洲新中文字幕| 亚洲国产一区二区在线| 欧美中文字幕在线视频| 欧美日韩中文字幕日韩欧美| 亚洲电影第1页| 久久精品国产69国产精品亚洲| 91久久精品网| 美女精品国产| 在线 亚洲欧美在线综合一区| 亚洲欧美日韩成人| 亚洲最新中文字幕| 欧美精品v国产精品v日韩精品| 狠狠色噜噜狠狠色综合久| 午夜天堂精品久久久久| 亚洲精品久久久久久久久| 看片网站欧美日韩| 亚洲国产精品ⅴa在线观看| 久热综合在线亚洲精品| 久久成人羞羞网站| 国产亚洲精品aa午夜观看| 亚洲第一页在线| 鲁鲁狠狠狠7777一区二区| 亚洲综合三区| 国产精品一二一区| 亚洲免费在线视频| 一本色道久久加勒比88综合| 欧美精品七区| 一区二区日本视频| 99这里有精品| 国产精品色一区二区三区| 午夜视频在线观看一区| 午夜电影亚洲| 国内精品久久久久久久影视蜜臀| 欧美一级欧美一级在线播放| 亚洲永久免费av| 国产日韩综合| 久久综合色8888| 欧美成人乱码一区二区三区| 亚洲精品在线电影| 日韩亚洲欧美精品| 国产精品色一区二区三区| 久久国产直播| 久久婷婷综合激情| 一区二区黄色| 欧美一区二区三区日韩| 在线观看亚洲精品| 亚洲激情偷拍| 国产精品xnxxcom| 久久久久国色av免费看影院 | 欧美日韩成人综合在线一区二区 | 亚洲欧洲日韩综合二区| 欧美午夜激情小视频| 欧美亚洲自偷自偷| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲一区二区三区四区五区午夜 | 亚洲午夜小视频| 午夜电影亚洲| 91久久黄色| 亚洲女同同性videoxma| 黄色成人在线免费| 日韩网站在线| 国语自产精品视频在线看| 亚洲电影有码| 国产女人精品视频| 亚洲第一精品夜夜躁人人爽| 欧美午夜在线一二页| 久久综合一区二区| 欧美调教视频| 欧美高清在线| 国产一区二区视频在线观看 | 亚洲深夜福利| 日韩一级精品视频在线观看| 午夜精品一区二区在线观看| 亚洲欧洲日产国产网站| 亚洲欧美日本日韩| 欧美日韩人人澡狠狠躁视频| 午夜精品99久久免费| 久久精品伊人| 亚洲一区中文| 免费一级欧美在线大片| 欧美尤物巨大精品爽| 欧美另类高清视频在线| 久久久久久久激情视频| 欧美午夜免费电影| 亚洲高清在线视频| 国产一区在线视频| 亚洲四色影视在线观看| 日韩一区二区电影网| 久久久久久一区二区| 香蕉尹人综合在线观看| 欧美片在线观看| 亚洲欧洲日产国产网站| 亚洲国产精品尤物yw在线观看| 午夜在线成人av| 欧美一区二区三区视频免费| 欧美日韩18| 亚洲免费高清| 在线午夜精品自拍| 欧美日韩国产影片| 91久久精品美女高潮| 亚洲精品久久久蜜桃| 牛牛影视久久网| 亚洲福利视频三区| 亚洲日韩中文字幕在线播放| 老司机aⅴ在线精品导航| 久久中文字幕一区| 在线不卡视频| 欧美国产1区2区| 亚洲人成在线播放| 亚洲小少妇裸体bbw| 国产精品欧美风情| 亚洲男人的天堂在线观看| 欧美亚洲网站| 国内综合精品午夜久久资源| 亚洲一区黄色| 久久手机免费观看| 最新日韩中文字幕| 欧美日产在线观看| 亚洲已满18点击进入久久| 久久av在线| 亚洲国产黄色| 欧美私人网站| 欧美自拍偷拍| 欧美激情欧美狂野欧美精品| 亚洲美女淫视频| 国产精品国色综合久久| 欧美一级片在线播放| 欧美成人中文字幕| 亚洲深夜av| 国产专区综合网| 欧美国产综合视频| 午夜精品视频在线观看一区二区| 卡一卡二国产精品| 日韩一区二区精品在线观看| 亚洲专区免费| 欧美日韩国产三区| 亚洲欧美日韩人成在线播放| 麻豆成人精品| 亚洲自拍偷拍视频| 亚洲电影激情视频网站| 欧美日韩久久| 欧美在线视频一区二区三区| 最新国产乱人伦偷精品免费网站 | 一区在线免费| 欧美另类亚洲| 久久久91精品国产一区二区三区| 亚洲国产美女精品久久久久∴| 性欧美办公室18xxxxhd| 亚洲精品一区二区在线| 国产午夜精品在线| 欧美四级电影网站| 欧美a级理论片| 久久国产88| 亚洲免费视频成人| 亚洲精品视频在线看| 美日韩精品免费观看视频| 亚洲欧美日韩在线播放| 亚洲三级免费| 亚洲高清电影| 韩国女主播一区二区三区| 国产精品mm| 欧美日韩中文字幕精品| 欧美人与禽性xxxxx杂性| 免费在线欧美黄色| 六十路精品视频| 久久男人av资源网站|