2012-02-07 4 views
0

は私が..私は、ペーストは、その後、私はリフレッシュする必要がありますいくつかのコードを実行する必要がありスレッドがジョブを完了してから次のコマンドを実行するまでにはどうすればよいですか?

private void btnPaste_Click(object sender, EventArgs e) 
    { 
     if (copiedItems != null) 
     { 
      if (copy) 
      { 
       System.Threading.Thread thPASTE = new System.Threading.Thread(PasteFromCopy); 
       thPASTE.Start(currAddress); 
       lock (this) 
       { 
        btnRefresh_Click(sender, e); 
       } 
      } 
      else 
      { 
       System.Threading.Thread thPASTE = new System.Threading.Thread(PasteFromMove); 
       thPASTE.Start(currAddress); 
       lock (this) 
       { 
        btnRefresh_Click(sender, e); 
       } 
      } 
     } 
    } 

その後、次のコマンドを実行し、そのジョブを完了スレッドまで待つ必要がある以下のコードを持っている(ただし、動作しません)私はそれが私のためにスレッドのリフレッシュを呼び出すときに動作しないため、私はそれを行うこの方法が必要です
どのように私はそれを行うのですか?

+0

また、代わりにthis' 'のロックを取っての、プライベートロック変数を検討する必要があります。例えば、 'private readonly object lockObject = new object();'詳細はこのスレッドを見ることができますhttp://stackoverflow.com/questions/251391/why-is-lockthis-bad –

+0

スレッドの開始には意味がありません。それを待ってください。 PasteFromCopy()を直接呼び出すこともできます。 –

答えて

5

スレッドインスタンスでJoinメソッドを使用すると、呼び出しスレッドをブロックして他のスレッドが終了するまでブロックできます。

1

i need to do it this way, because it doesn't work for me when i call the refresh in the thread

あなたの問題をJoinのようなスレッドの同期とは関係ありません、WaitWaitOneなどの二次スレッドではないため、Windowsフォームでのセカンダリスレッドからのユーザーインターフェイス要素を更新

は注意が必要ですフォームまたはその子コントロールから直接プロパティ値を読み書きすることができます。この制限は、Windowsフォームのフォームオブジェクトとコントロールオブジェクトがスレッドセーフではないために発生します。直接フォームまたはそのコントロールのいずれかのプロパティ値にアクセスすることを許可されています唯一のスレッドは、あなたがInvokeかを呼び出す必要が

スレッドからあなたのGUI(他のあなたのメインスレッド)を更新するには、プライマリUIスレッドですBeginInvoke UIスレッドのディスパッチャにデリゲートを挿入するフォームのメソッド(または何らかのコントロール)。

これらのリンクはあなたを助けることができます。

How to update GUI from another thread in C#?

Updating the UI from a Secondary Thread

Updating the GUI from another thread made easy

関連する問題