跨線程時使用靜態擴展方法更新控件

在CodeProject上看一個跨線程更新的方法,備忘一下。 若是在應用中存在較多簡單的跨線程操做,下面的方法可能比較實用:c#

<!-- lang: c# -->
public static class ExtensionMethod
{
    /// <summary>
    /// 有返回值的擴展方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="isi"></param>
    /// <param name="call"></param>
    /// <returns></returns>
    public static TResult SafeInvoke<T, TResult>(this T isi, Func<T, TResult> call) where T : ISynchronizeInvoke
    {
        if (isi.InvokeRequired) { 
            IAsyncResult result = isi.BeginInvoke(call, new object[] { isi }); 
            object endResult = isi.EndInvoke(result); return (TResult)endResult; 
        }
        else
            return call(isi);
    }
    /// <summary>
    /// 沒有返回值的擴展方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="isi"></param>
    /// <param name="call"></param>
    public static void SafeInvoke<T>(this T isi, Action<T> call) where T : ISynchronizeInvoke
    {
        if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi });
        else
            call(isi);
    }
}

而後在使用時就可使用匿名委託很方便的操做:異步

<!-- lang: c# -->
    lblProcent.SafeInvoke(d => d.Text = textForLabel);
    progressBar1.SafeInvoke(d => d.Value = i);
    string labelText = lblProcent.SafeInvoke(d => d.Text);

靜態的擴展類方法使用泛型模板擴展像全部可繼承 ISynchronizeInvoke 接口的控件,幾乎適用於常見的全部控件呦 (來自 CodeProject 爲全部類型的更新建立異步委託ui

相關文章
相關標籤/搜索