在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