在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