2012-03-14 5 views
0

私は作成したクラスを持っていますが、クラスではマルチスレッドを行います。通常、私のマルチスレッドをフォーム上で行うには、以下のメソッドを使用します。InvokeRequiredプロパティとInvokeメソッドを使用してスレッドセーフな関数でクラスを作成する

//Thread Safe Functions 
delegate void Thread_Safe_SendMessage_Progress_Callback(string sProgress); 
private void Thread_Safe_SendMessage_Progress(string sProgress) 
{ 
    if (this.InvokeRequired) 
    { 
     Thread_Safe_SendMessage_Progress_Callback d = 
      new Thread_Safe_SendMessage_Progress_Callback(Thread_Safe_SendMessage_Progress); 
     try 
     { 
      this.Invoke(d, new object[] { sProgress }); 
     } 
     catch 
     { 
      //ObjectDisposedException 
     } 
    } 
    else 
    { 
     //Fire up the thread event 
     SendMessageThread_Progress(sProgress); 
    } 
} 

これで完璧です!この時点で、私はマルチスレッドを私が作ったクラスに持っていこうとします。私は、InvokeRequiredプロパティを除いてすべてが素晴らしいと思われ、Invokeメソッドはクラス内に存在しません。だから、使用してthis.InvokeRequiredは、私はこれを行うプロパティ今

private bool InvokeRequired 
{ 
    get 
    { 
     //Get the current thread id 
     int iThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId; 

     //Compare and return results 
     return (iThreadID != m_iThreadID); 
    } 
} 

を...(スレッドがで始めるために作成されたときにm_iThreadIDは、コンストラクタで設定されていることに注意してください)というのが私のクラスを与えるために...エラーがスローされます残っているのはInvokeメソッドだけです。これをどのように動作させるには?

+0

http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/09b7285d-3294-483c-ad92-36d202285d43 –

答えて

0

Invokeの方法は複製が簡単ではありません(副疑問:BeginInvokeを使用してみませんか?同期イベントを発生させる必要はありません)。 Application.OpenForms(使用前にコピーしてください)の最初の書式を入手して、InvokeRequiredBeginInvoke/Invokeを確認してください。

+0

ありがとうアドリアーノ!ちょうど私の答えを見つけ出して、それはかなり簡単でした...私は100人以下の人ですが、私は自分自身に答えるまでにさらに7時間待たなければなりません。:/私は本当に簡単な解決策を持っています。共有します! –

+0

私は不思議です、私はそれのようなものに対処しなければなりませんでしたし、より優れたより一般的な解決策は本当に歓迎です! –

+0

アドリアーノ、私はシンプルなソリューションを投稿し、それは私にとって素晴らしい仕事です!すべてが私のクラスに包まれています! :) –

関連する問題