0

特定の時間のラベルにテキストを表示したいので、Google で検索したところ、次の 2 つの解決策が見つかりました。

最初の解決策は次のとおりです。

public void InfoLabel(string value)
{
    if (InvokeRequired)
    {
        this.Invoke(new Action<string>(InfoLabel), new object[] { value });
        return;
    }
    barStaticItem3.Caption = value;

    if (!String.IsNullOrEmpty(value))
    {
        System.Timers.Timer timer = 
                                new System.Timers.Timer(3000) { Enabled = true };
        timer.Elapsed += (sender, args) =>
        {
            this.InfoLabel(string.Empty);
            timer.Dispose();
        };
    }
}

2番目の解決策:

private void ShowTextForParticularTime(String caption)
{
    Timer t = new Timer { Interval = 5000, Enabled = true};
    t.Tick += (sender, args) => OnTimerEvent(sender, args, caption);  
}

private void OnTimerEvent(object sender, EventArgs e, String caption)
{
    barStaticItem3.Caption = caption;
}

2つのソリューションの違いと、この記号「=>」を使用する理由を教えてください。また、この行から何も理解できませんでした:

if (InvokeRequired)
{
    this.Invoke(new Action<string>(InfoLabel), new object[] { value });
    return;
}
4

2 に答える 2

2

WinForms と WPF では、問題のコントロールを作成したスレッドからのみ UI を更新できます。これら 2 つのアプローチは、別のスレッドから UI を更新する 2 つの方法を示しています。

最初のアプローチでは、コードが別のスレッドで実行されているかどうかを手動で確認し、実行されている場合は UI スレッドへの呼び出しをマーシャリングします。

2 番目のアプローチはイベントを使用し、マーシャリングの詳細を .NET に任せます。

記号 => はラムダ式を表します。これは、関数ポインターのように考えることができます (実際には、舞台裏で式ツリーと呼ばれるものである場合もあります)。基本的に、変数を参照して呼び出すことができるコードを指す変数を作成します。

どちらのアプローチもうまくいくはずです。個人的には、フレームワークがより多くの配管作業を処理できるようにするため、2 番目のアプローチを好みます。

于 2012-09-26T23:47:49.267 に答える
2

さて、ここで説明するのに十分な量があります。

あなたが示した2つのオプションの間に大きな違いはありません。これらが異なって見える理由は、最初の id がパブリック メソッド内でデリゲート メソッド (ラムダ式) を宣言しているのに対し、2 番目の id は単にイベント ハンドラーを作成しているためです。彼らはほとんど同じことをします。実際、デリゲート メソッドには、伝統的なイベント ハンドラー パラメーター (オブジェクト センダー、EventArgs e) があることがわかります。個人的には、2 番目のソリューションの方がきれいに見えるので好みです。

Invoke Required は、スレッド化を処理するために使用されます。C# では、ビジュアル オブジェクトを作成していないスレッドがビジュアル オブジェクトを変更しようとすると、エラーがスローされます。これを回避するには、"Invoke" を呼び出してビジュアル オブジェクトを作成したスレッドを呼び出します。「InvokeRequired」プロパティは、現在のスレッドがビジュアル オブジェクトを作成しなかったかどうかを示します。デリゲート メソッドをスレッド化または作成する場合は、常にこれを使用する必要があります (それらを実行するスレッドを制御できないため)。

この簡単な説明がお役に立てば幸いです。不明な点はコメント

于 2012-09-26T23:52:07.630 に答える