最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#多線(xiàn)程異步執(zhí)行和跨線(xiàn)程訪(fǎng)問(wèn)控件Helper

 更新時(shí)間:2022年04月24日 08:36:35   作者:農(nóng)碼一生  
這篇文章介紹了C#多線(xiàn)程異步執(zhí)行和跨線(xiàn)程訪(fǎng)問(wèn)控件Helper,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、工具類(lèi)代碼

    public class TaskHelper
    {

        #region 多線(xiàn)程操作
        /// <summary>
        /// 功能描述:多線(xiàn)程執(zhí)行方法,方法無(wú)參數(shù),無(wú)返回值
        /// </summary>
        /// <param name="func">方法,如果方法中調(diào)用了控件,請(qǐng)使用 ThreadInvokerControl(() => { 您的操作})進(jìn)行包括</param>
        /// <param name="callback">執(zhí)行完成回調(diào),參數(shù)為object,如果錯(cuò)誤返回的是Exception,否則為null,如果為空則默認(rèn)調(diào)用基類(lèi)回調(diào)方法</param>
        /// <param name="enableControl">調(diào)用線(xiàn)程時(shí)禁用的控件</param>
        public static void TaskRun(
          Form frm,
          Func<Task> func,
          Action<object> callback = null,
          Control[] enableControl = null)
        {
            if (enableControl != null)
            {
                SetControlEnableds(enableControl, false);
            }

            Task.Factory.StartNew(() =>
            {
                try
                {
                    Task task = func();
                    if (task.Exception != null && task.Exception.InnerException != null)
                        throw task.Exception.InnerException;
                    callback?.Invoke(null);
                }
                catch (Exception ex)
                {
                    if (callback != null)
                        callback(ex);
                    else
                        ThreadBaseCallBack(frm, ex);
                }
                finally
                {
                    if (enableControl != null && frm != null)
                        ThreadInvokerControl(frm, () => { SetControlEnableds(enableControl, true); });
                }
            });
        }

        /// <summary>
        /// 功能描述:線(xiàn)程默認(rèn)回調(diào)方法
        /// </summary>
        public static void ThreadBaseCallBack(Form frm, Exception ex)
        {
            if (frm != null)
            {
                ThreadInvokerControl(frm, () =>
                {
                    try
                    {
                        Exception lastEx = ex.GetOriginalException();
                        MessageBox.Show(lastEx.Message);
                    }
                    catch
                    {

                    }
                });
            }
        }

        /// <summary>
        /// 功能描述:委托調(diào)用,用于夸線(xiàn)程訪(fǎng)問(wèn)控件
        /// </summary>
        /// <param name="action">action</param>
        /// <param name="f">所在窗體,默認(rèn)使用當(dāng)前窗體</param>
        public static void ThreadInvokerControl(Form frm, Action action)
        {
            if (frm != null)
            {
                if (frm.InvokeRequired)
                {
                    frm.BeginInvoke(action);
                }
                else
                {
                    action();
                }
            }
        }

        #endregion

        #region 提示層
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        private static void ShowProcessPanel(Control parent, string strMessage)
        {
            if (parent.InvokeRequired)
            {
                parent.BeginInvoke(new MethodInvoker(delegate
                {
                    ShowProcessPanel(parent, strMessage);
                }));
            }
            else
            {
                parent.VisibleChanged -= new EventHandler(parent_VisibleChanged);
                parent.VisibleChanged += new EventHandler(parent_VisibleChanged);
                parent.FindForm().FormClosing -= ControlHelper_FormClosing;
                parent.FindForm().FormClosing += ControlHelper_FormClosing;
                Control control = null;
                lock (parent)
                {
                    control = HaveProcessPanelControl(parent);
                    if (control == null)
                    {
                        control = CreateProgressPanel();
                        parent.Controls.Add(control);
                    }
                }
                FWaiting fWaiting = control.Tag as FWaiting;
                fWaiting.Message = strMessage;
                fWaiting.Show();
            }
        }
        private static void ControlHelper_FormClosing(object sender, FormClosingEventArgs e)
        {
            Control control = sender as Control;
            control.FindForm().FormClosing -= ControlHelper_FormClosing;
            CloseWaiting(control);
        }

        private static void parent_VisibleChanged(object sender, EventArgs e)
        {
            Control control = sender as Control;
            control.VisibleChanged -= new EventHandler(parent_VisibleChanged);
            if (!control.Visible)
            {
                CloseWaiting(control);
            }
        }
        private static void CloseWaiting(Control control)
        {
            Control[] array = control.Controls.Find("myProgressPanelext", false);
            if (array.Length > 0)
            {
                Control myProgress = array[0];
                if (myProgress.Tag != null && myProgress.Tag is FWaiting)
                {
                    FWaiting fWaiting = myProgress as FWaiting;
                    if (fWaiting != null && !fWaiting.IsDisposed && fWaiting.Visible)
                    {
                        fWaiting.Hide();
                    }
                }
            }
        }
        private static void CloseProcessPanel(Control parent)
        {
            if (parent.InvokeRequired)
            {
                parent.BeginInvoke(new MethodInvoker(delegate
                {
                    CloseProcessPanel(parent);
                }));
            }
            else if (parent != null)
            {
                Control control = HaveProcessPanelControl(parent);
                if (control != null)
                {
                    Form frm = control.Tag as Form;
                    if (frm != null && !frm.IsDisposed && frm.Visible)
                    {
                        if (frm.InvokeRequired)
                        {
                            frm.BeginInvoke(new MethodInvoker(delegate
                            {
                                frm.Hide();
                            }));
                        }
                        else
                        {
                            frm.Hide();
                        }
                    }
                }
            }
        }
        private static Control HaveProcessPanelControl(Control parent)
        {
            Control[] array = parent.Controls.Find("myProgressPanelext", false);
            Control result;
            if (array.Length > 0)
            {
                result = array[0];
            }
            else
            {
                result = null;
            }
            return result;
        }
        private static Control CreateProgressPanel()
        {
            return new Label
            {
                Name = "myProgressPanelext",
                Visible = false,
                Tag = new FWaiting
                {
                    TopMost = true,
                }
            };
        }
        #endregion

        #region 禁用控件時(shí)不改變空間顏色
        [System.Runtime.InteropServices.DllImport("user32.dll ")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int wndproc);
        [System.Runtime.InteropServices.DllImport("user32.dll ")]
        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

        private const int GWL_STYLE = -16;
        private const int WS_DISABLED = 0x8000000;

        /// <summary>
        /// 功能描述:設(shè)置控件的Enable屬性,控件不改顏色
        /// </summary>
        /// <param name="c">c</param>
        /// <param name="enabled">enabled</param>
        private static void SetControlEnabled(Control c, bool enabled)
        {
            if (enabled)
            {
                SetWindowLong(c.Handle, GWL_STYLE, (~WS_DISABLED) & GetWindowLong(c.Handle, GWL_STYLE));
            }
            else
            {
                SetWindowLong(c.Handle, GWL_STYLE, WS_DISABLED + GetWindowLong(c.Handle, GWL_STYLE));
            }
        }

        /// <summary>
        /// 功能描述:設(shè)置多個(gè)控件的Enable屬性,控件不改顏色
        /// </summary>
        /// <param name="cs">cs</param>
        /// <param name="enabled">enabled</param>
        private static void SetControlEnableds(Control[] cs, bool enabled)
        {
            foreach (var c in cs)
            {
                SetControlEnabled(c, enabled);
            }
        }
        #endregion
    }

二、調(diào)用代碼

            TaskHelper.TaskRun(this, async () =>
            {
                TaskHelper.ThreadInvokerControl(this, () =>
                {
                    //夸線(xiàn)程訪(fǎng)問(wèn)控件的
                    this.btnStart.Enabled = true;
                    this.btnStart.BackColor = Color.Gainsboro;
                });
            });

到此這篇關(guān)于C#多線(xiàn)程異步執(zhí)行和跨線(xiàn)程訪(fǎng)問(wèn)控件Helper的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程

    利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程

    電子簽名在文檔合規(guī)性與安全性保障中扮演著重要角色,基于 C# 開(kāi)發(fā) PDF 電子簽名功能是企業(yè)級(jí)文檔處理場(chǎng)景的常見(jiàn)需求,Spire.PDF for .NET 作為國(guó)產(chǎn) PDF 處理類(lèi)庫(kù),無(wú)需依賴(lài) Adobe Acrobat 等第三方軟件,即可便捷實(shí)現(xiàn) PDF 電子簽名添加,本文為大家詳細(xì)介紹一下
    2025-12-12
  • 在C#中將Word轉(zhuǎn)換為PostScript的代碼實(shí)現(xiàn)

    在C#中將Word轉(zhuǎn)換為PostScript的代碼實(shí)現(xiàn)

    在需要高質(zhì)量打印或跨平臺(tái)文檔分發(fā)的場(chǎng)景中,將Word轉(zhuǎn)換為PostScript是專(zhuān)業(yè)選擇,所以本文給大家介紹了如何在 C# 中將 Word 轉(zhuǎn)換為 PostScript,需要的朋友可以參考下
    2025-09-09
  • C# 檢索不區(qū)分大小寫(xiě)并高亮顯示實(shí)例詳解

    C# 檢索不區(qū)分大小寫(xiě)并高亮顯示實(shí)例詳解

    這篇文章主要介紹了C# 檢索不區(qū)分大小寫(xiě)并高亮顯示實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C#灰度化圖像的實(shí)例代碼

    C#灰度化圖像的實(shí)例代碼

    灰度化一幅圖像就是將圖像的色彩信息全部丟掉,將24位的位圖信息,用8位來(lái)表示,灰度圖共有256級(jí)灰度等級(jí),也就是將24位位圖的一點(diǎn)如(255,255,255)轉(zhuǎn)換成255,所以R,G,B三個(gè)值所乘的系數(shù)和為1
    2013-09-09
  • C#/VB.NET實(shí)現(xiàn)HTML轉(zhuǎn)為XML的示例代碼

    C#/VB.NET實(shí)現(xiàn)HTML轉(zhuǎn)為XML的示例代碼

    可擴(kuò)展標(biāo)記語(yǔ)言(XML)文件是一種標(biāo)準(zhǔn)的文本文件,它使用特定的標(biāo)記來(lái)描述文檔的結(jié)構(gòu)以及其他特性。本文將利用C#實(shí)現(xiàn)HTML轉(zhuǎn)為XML,需要的可以參考一下
    2022-06-06
  • C#實(shí)現(xiàn)鼠標(biāo)消息捕獲

    C#實(shí)現(xiàn)鼠標(biāo)消息捕獲

    這篇文章介紹了C#實(shí)現(xiàn)鼠標(biāo)消息捕獲的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#獲取不重復(fù)的編碼的最佳實(shí)踐

    C#獲取不重復(fù)的編碼的最佳實(shí)踐

    本文針對(duì)軟件開(kāi)發(fā)中“為新對(duì)象分配唯一編碼”的常見(jiàn)需求,以C#通信設(shè)備管理場(chǎng)景為例,從原始代碼分析入手,逐步講解基于LINQ和哈希集合的優(yōu)化方案,幫助開(kāi)發(fā)者理解不同場(chǎng)景下的最佳實(shí)踐,需要的朋友可以參考下
    2025-09-09
  • C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法

    C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C#迭代器方法介紹

    C#迭代器方法介紹

    這篇文章主要介紹了C#迭代器方法,可以使用foreach循環(huán)語(yǔ)句進(jìn)行的迭代的方法,稱(chēng)為可迭代方法,或者迭代器方法,方法操作,想了解更多內(nèi)容得小伙伴可以學(xué)習(xí)下面文章內(nèi)容,希望給你的學(xué)習(xí)帶來(lái)幫助
    2022-03-03
  • C# 運(yùn)算符 ?、??、?: 各種問(wèn)號(hào)的用法和說(shuō)明

    C# 運(yùn)算符 ?、??、?: 各種問(wèn)號(hào)的用法和說(shuō)明

    本文介紹C#中三種常見(jiàn)的問(wèn)號(hào)運(yùn)算符的使用方法,簡(jiǎn)單講解給大家,希望對(duì)大家有所幫助。
    2016-04-04

最新評(píng)論

临城县| 三亚市| 龙南县| 柳江县| 安徽省| 黔南| 长治市| 福州市| 嘉黎县| 山丹县| 龙南县| 城步| 电白县| 巴彦淖尔市| 北安市| 石楼县| 台湾省| 深水埗区| 青冈县| 基隆市| 察哈| 承德县| 山东| 桑日县| 赤城县| 拜城县| 临西县| 桓台县| 襄垣县| 嵊泗县| 通道| 澎湖县| 武宣县| 深水埗区| 宜阳县| 静宁县| 淮阳县| 宜宾市| 临西县| 泗水县| 美姑县|