1

メインスレッドで呼び出すための万能ユーティリティを作成しようとしました。以下は私が思いついたものです - この方法で何か問題はありますか? IsHandleCreated と IsDisposed の両方のチェックは冗長ですか? Disposed の場合、IsHandleCreated は false に設定されますか? (それがboolのデフォルト値であるため)

    public static void InvokeMain(this Control Source, Action Code)
    {
        try
        {
            if (Source == null || !Source.IsHandleCreated || Source.IsDisposed) { return; }
            if (Source.InvokeRequired)
            {
                Source.BeginInvoke(Code);
            }
            else
            {
                Code.Invoke();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }    
    }

ありがとうございます!ウィリアム

4

1 に答える 1

0

頭の中で答えているので、間違っていたらすみません。

例外を予期していない限り、例外をトラップしないでください。例外がスローされた場合にどのように反応するかを知っている場合を除きます。メッセージでも何でも。

また、コントロールが null / 初期化されていない場合に返されるのは、バグの可能性を隠していることを意味します。なぜそれをしたいのでしょうか? NullPointer 例外が発生するのを防ぎたい場合は、コントロールが null の場合、自分で (ArgumentNullException として) 例外を発生させる必要があります。

public static void Invoke(this Control control, Action action)
{
    if (control == null)
        throw new ArgumentNullException("control");

    if (control.InvokeRequired)
    {
        control.Invoke(action);
        return;
    }

    action();
}

public static T Invoke<T>(this Control control, Func<T> action)
{
    if (control == null)
        throw new ArgumentNullException("control");

    if (control.InvokeRequired)
        return (T)control.Invoke(action);

    return action();
}
于 2012-05-09T18:34:49.547 に答える