質問

だから、私はいくつかの.NETプログラミングに戻っていました、そして、vs.Net 2010の新機能を通じて、それは私がそのコントロールを作成しなかったスレッドからコントロールを変更しようとしているケースを検出し、私に私を向けましたこれを正しく行う方法についてのMSDNに関する記事...

' HOW TO WRITE TO A FORM CONTROL FROM A THREAD THAT DIDN'T CREATE THE CONTROL
' ===========================================================================
' Say you need to write to a UI text box that logs stuff...
Delegate Sub WriteLogDelegate(ByVal [text] As String)
Private Sub WriteLog(ByVal [text] As String)
    If Me.rtfLog.InvokeRequired Then
        ' We are not in the same thread!
        ' Create new WriteLogDelegate and invoke it on the same thread
        Dim d As New WriteLogDelegate(AddressOf WriteLog)
        Me.rtfLog.Invoke(d, New Object() {[text]})
    Else
        ' We are totally in the same thread...
        ' Call AppendText like normal!
        Me.rtfLog.AppendText([text])
    End If
End Sub

そして、Vs.Netの以前のバージョンが私がプロジェクトの学部生だったのでこれにフラグを立てていなかったので、私はこれを5年ほど困惑させたので、私はとても興奮していました。

うーん...ごめんなさい。落ち着きが回復しました。とにかく、私はこのビットの.net-fuを知っているので、何が起こっているのか、それがどのように機能するかについてもっと知りたいです。

.NET ReflectorのInvoke()のコードはどこにありますか?

役に立ちましたか?

解決

さて、あなたの例で起こっているすべてのことを名前にしましょう。

  1. あなたがそこに示しているコード クロスレディングまたはマルチスレッドプログラミング。(それはdotnetの最初から存在します)。
  2. あなたの rtflog Invokerequiredの標準機能を使用しています - これは意地悪です、 そのrtflogはコントロールクラスから継承しています.
    2.A.コントロールクラスはWinforms構造の一部です。
  3. 「私たちは同じスレッドにいない!」というコードに到達するために2つ以上を作成する必要があります スレッド.

全体として、リフレクターはあなたに実装を示すことができますが、あなたが見つけることができるアイデア 記事.
実装を見たいと思っている場合は、「コード詩人」の答えのような短いコードを編集して、彼を見てください リフレクター。(この部分を確認してください、リフレクターはあなたの元のコードをかなり閉じるものをあなたに示します。)

他のヒント

これはコメントである必要がありますが、コメントでコード形式ではありません。

C#を使用している場合、このストーリーはさらに簡単になる可能性があります。

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}

これがmsdnのcontrol.invokeです: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top