iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >C#多线程异步执行和跨线程访问控件Helper怎么用
  • 120
分享到

C#多线程异步执行和跨线程访问控件Helper怎么用

2023-06-30 10:06:05 120人浏览 薄情痞子
摘要

本文小编为大家详细介绍“C#多线程异步执行和跨线程访问控件Helper怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程异步执行和跨线程访问控件Helper怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习

本文小编为大家详细介绍“C#多线程异步执行和跨线程访问控件Helper怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程异步执行和跨线程访问控件Helper怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、工具类代码

    public class TaskHelper    {        #region 多线程操作        /// <summary>        /// 功能描述:多线程执行方法,方法无参数,无返回值        /// </summary>        /// <param name="func">方法,如果方法中调用了控件,请使用 ThreadInvokerControl(() => { 您的操作})进行包括</param>        /// <param name="callback">执行完成回调,参数为object,如果错误返回的是Exception,否则为null,如果为空则默认调用基类回调方法</param>        /// <param name="enableControl">调用线程时禁用的控件</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>        /// 功能描述:线程默认回调方法        /// </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>        /// 功能描述:委托调用,用于夸线程访问控件        /// </summary>        /// <param name="action">action</param>        /// <param name="f">所在窗体,默认使用当前窗体</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 禁用控件时不改变空间颜色        [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>        /// 功能描述:设置控件的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>        /// 功能描述:设置多个控件的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    }

二、调用代码

            TaskHelper.TaskRun(this, async () =>            {                TaskHelper.ThreadInvokerControl(this, () =>                {                    //夸线程访问控件的                    this.btnStart.Enabled = true;                    this.btnStart.BackColor = Color.Gainsboro;                });            });

读到这里,这篇“C#多线程异步执行和跨线程访问控件Helper怎么用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: C#多线程异步执行和跨线程访问控件Helper怎么用

本文链接: https://www.lsjlt.com/news/327946.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#多线程异步执行和跨线程访问控件Helper
    一、工具类代码 public class TaskHelper { #region 多线程操作 /// <summary>...
    99+
    2024-04-02
  • C#多线程异步执行和跨线程访问控件Helper怎么用
    本文小编为大家详细介绍“C#多线程异步执行和跨线程访问控件Helper怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程异步执行和跨线程访问控件Helper怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-30
  • c#怎么跨线程访问控件
    在C#中,要跨线程访问控件,可以通过以下步骤: 在UI线程中,使用Control类的Invoke或BeginInvoke方法来调用...
    99+
    2023-10-28
    c#
  • c#使用MethodInvoker解决跨线程访问控件
    在C#中,如果要在一个线程中访问另一个线程中的控件,可以使用MethodInvoker来解决跨线程访问控件的问题。MethodInv...
    99+
    2023-09-15
    C#
  • winform跨线程访问控件怎么实现
    在WinForm中,如果要在一个线程中访问另一个线程中的控件,可以使用Control类的Invoke方法或BeginInvoke方法...
    99+
    2023-09-13
    winform
  • wpf跨线程访问控件怎么实现
    在WPF中,跨线程访问控件可以使用Dispatcher对象来实现。Dispatcher对象是一个线程相关的对象,它提供了一种将操作发...
    99+
    2023-10-23
    wpf
  • C#异步多线程ThreadPool怎么使用
    这篇文章主要讲解了“C#异步多线程ThreadPool怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异步多线程ThreadPool怎么使用”吧!启动线程池线程ThreadPool...
    99+
    2023-06-25
  • java异步线程不执行怎么解决
    如果Java异步线程不执行,可以尝试以下几种解决方法:1. 检查线程是否正确创建和启动:确保创建了一个Thread对象并调用了sta...
    99+
    2023-08-31
    java
  • C#异步委托和多线程怎么理解
    这篇文章主要讲解了“C#异步委托和多线程怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异步委托和多线程怎么理解”吧!关于这个问题,我想很多初学者跟我一样有很多疑问吧。下面我说的内...
    99+
    2023-06-18
  • C# winform跨线程操作控件怎么实现
    今天小编给大家分享一下C# winform跨线程操作控件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提...
    99+
    2023-07-02
  • C#多线程控制进度条的异步调用怎么实现
    这篇文章主要讲解了“C#多线程控制进度条的异步调用怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程控制进度条的异步调用怎么实现”吧!看看具体的步骤和实现:在上面的代码中,我们...
    99+
    2023-06-17
  • C#中异步和多线程的区别是什么
    本篇内容介绍了“C#中异步和多线程的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、区别和联系异步和多线程有什么区别?其实,异步...
    99+
    2023-06-30
  • 详解C#异步多线程使用中的常见问题
    目录异常处理线程取消临时变量线程安全异常处理 小伙伴有没有想过,多线程的异常怎么处理,同步方法内的异常处理,想必都非常非常熟悉了。那多线程是什么样的呢,接着我讲解多线程的异常处理 首...
    99+
    2024-04-02
  • C#开发中如何处理多线程同步和互斥访问
    C#开发中如何处理多线程同步和互斥访问,需要具体代码示例在C#开发中,多线程的使用可以提高程序的并发性和性能。然而,多线程的并发执行也可能导致一些问题,如数据竞争和资源冲突等。为了解决这些问题,我们需要使用同步和互斥机制来确保线程之间的正确...
    99+
    2023-10-22
    多线程 同步 互斥 访问 C#开发
  • 怎么在java中利用多线程执行多个程序
    这期内容当中小编将会给大家带来有关怎么在java中利用多线程执行多个程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于...
    99+
    2023-06-14
  • 怎么使用PHP多线程执行多个方法
    这篇文章主要介绍“怎么使用PHP多线程执行多个方法”,在日常操作中,相信很多人在怎么使用PHP多线程执行多个方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP多线程执行多个方法”的疑惑有所帮助!...
    99+
    2023-07-05
  • C#异步多线程使用中的常见问题有哪些
    本篇内容主要讲解“C#异步多线程使用中的常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#异步多线程使用中的常见问题有哪些”吧!异常处理小伙伴有没有想过,多线程的异常怎么处理,同步...
    99+
    2023-06-22
  • java for循环内执行多线程问题怎么解决
    这篇文章主要介绍了java for循环内执行多线程问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java for循环内执行多线程问题怎么解决文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • C#多线程锁lock和Monitor怎么用
    本文小编为大家详细介绍“C#多线程锁lock和Monitor怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程锁lock和Monitor怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1,Loc...
    99+
    2023-06-29
  • 使用多线程执行任务,并获取返回结果,附异步实现
    1 获取又返回结果的 需要用到 callable接口 public class TestTask implements Callable { @Override public Studen...
    99+
    2023-09-01
    java jvm servlet
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作