跨线程时使用静态扩展方法更新控件

在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

相关文章
相关标签/搜索