Winform跨线程操作界面的策略

BeginInvoke(new ThreadStart(() => toolStripButton1.Text = "aaa"));

1、非跨线程操作和部分跨线程get不会引发异常;

2、跨线程set,见上面的例子。

3、部分跨线程get,见下面的例子。

var a = (int)EndInvoke(BeginInvoke(new Func<int>(() => toolStripComboBox1.SelectedIndex)));

 

public static class UIInvokeHelper
{
    public static void InvokeUI(this Form form, Action action)
    {
        if (form == null)
        {
            throw new ArgumentNullException("form");
        }
        if (action == null)
        {
            throw new ArgumentNullException("action");
        }
        if (form.InvokeRequired)
        {
            form.Invoke(new Action(action), null);
        }
        else
        {
            action();
        }
    }
    public static T InvokeUI<T>(this Form form, Func<T> func)
    {
        if (form == null)
        {
            throw new ArgumentNullException("form");
        }
        if (func == null)
        {
            throw new ArgumentNullException("func");
        }
        if (form.InvokeRequired)
        {
            return (T)form.Invoke(new Func<T>(func));
        }
        return func();
    }
}

 

public static class UIInvokeHelper
{
    /// <summary>
    /// 适用于非耗时、无返回值的跨线程界面操作。
    /// </summary>
    /// <param name="form"></param>
    /// <param name="action"></param>
    public static void InvokeUI(this Form form, Action action)
    {
        if (form == null)
        {
            throw new ArgumentNullException("form");
        }
        if (action == null)
        {
            throw new ArgumentNullException("action");
        }
        if (form.InvokeRequired)
        {
            form.Invoke(new Action(action));
        }
        else
        {
            action();
        }
    }
    /// <summary>
    /// 适用于有返回值的跨线程界面操作。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="form"></param>
    /// <param name="func"></param>
    /// <returns></returns>
    public static T InvokeUI<T>(this Form form, Func<T> func)
    {
        if (form == null)
        {
            throw new ArgumentNullException("form");
        }
        if (func == null)
        {
            throw new ArgumentNullException("func");
        }
        if (form.InvokeRequired)
        {
            return (T)form.Invoke(new Func<T>(func));
        }
        return func();
    }
    /// <summary>
    /// 适用于耗时、无返回值的跨线程界面操作。
    /// </summary>
    /// <param name="form"></param>
    /// <param name="action"></param>
    public static void BeginInvokeUI(this Form form, Action action)
    {
        if (form == null)
        {
            throw new ArgumentNullException("form");
        }
        if (action == null)
        {
            throw new ArgumentNullException("action");
        }
        if (form.InvokeRequired)
        {
            form.BeginInvoke(new Action(action));
        }
        else
        {
            Task.Factory.StartNew(action);
        }
    }
}

 

posted on 2013-07-09 17:29  yao2yao4  阅读(399)  评论(0编辑  收藏  举报

导航