5

スレッド化についての精神的な把握を試みるために、monkey-see-monkey-doを試し、MSDNのTHIS_PAGEからコピーしました(読み取りと入力、カットアンドペーストではありません)。

それをすると、次のエラーが発生しました

エラー2タイプまたは名前空間名'SetTextCallback'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)Form1.cs 385 17 ZYX987

エラー3タイプまたは名前空間名'SetTextCallback'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)Form1.cs 385 41 ZYX987

Webページを下にスクロールすると、例が誤解を招くため、全員がまったく同じ問題を抱えていることを示すコミュニティコメントがたくさん見つかりました。つまり、SetTextCallback宣言されることはありません。

これは、MSDNページを見つめながら入力したコピーキャットバージョンです...

private void SetText(string text)
{
    // InvokeRequired required compares the thread ID of
    // the calling thread to the thread ID of the 
    // creating thread.  If these threads are different, 
    // it returns true
    if (this.label1.InvokeRequired)                    
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.label1.Text = text;
    }
}

ここの誰かSetTextCallbackが私のCopyCatCodeのどこに配置すべきか提案してくれませんか?

2番目の質問:それを宣言するための構文はどのように見えますか?

3番目の質問:SetTextCallbackがメソッドである場合、その中に何を含める必要がありますか?

StackOverflowで「...SetTextCallback...」(引用符なし)を検索したところ、いくつかの参照が見つかりましたが、この正確な問題ではありません。これがここに属する種類の質問であることを願っています。読んでくれてありがとう。

4

4 に答える 4

10

リンクしたmsdnページ(「方法:Windowsフォームコントロールへのスレッドセーフな呼び出しを行う」)を下にスクロールすると、完全なソースが下部に一覧表示されます。そこに定義があります:

    // This delegate enables asynchronous calls for setting
    // the text property on a TextBox control.
    delegate void SetTextCallback(string text);
于 2013-01-09T01:30:14.430 に答える
3

SetTextCallbackは、委任しているメソッドと同じ署名を持つ単純な委任になります。

好き:

public delegate void SetTextCallback(string message);

このチュートリアルの恩恵を受けることもできます

于 2013-01-09T01:30:05.927 に答える
3

これの完全な例を見てください:

// This delegate enables asynchronous calls for setting
// the text property on a TextBox control.
delegate void SetTextCallback(string text);
于 2013-01-09T01:31:55.173 に答える
2

私は同じ問題を抱えていました、そしてこれは私の解決策です

私は受信したデータでシリアルポートを読んでいて、受信したテキストをテキストボックスに入れる必要がありました。これを実行しました。

public void puerto_serie_DataReceived(object sender,
                                   System.IO.Ports.SerialDataReceivedEventArgs e)
{
  string a = this.puerto_serie.ReadLine().Trim();
  leer(a);
}
delegate void SetTextCallback(string text);
void leer(String b)
{
  if (valores.InvokeRequired)
  {
    SetTextCallback d = new SetTextCallback(leer);
    this.Invoke(d, new object[] { b });
  }
  else
  {
    valores.Text += this.puerto_serie.ReadLine().Trim()+"\n";
  }
}
于 2013-04-26T05:47:00.413 に答える