`
chenp1111
  • 浏览: 242737 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

子线程调用主线程内容请使用委托函数

    博客分类:
  • C#
 
阅读更多
主线程读取文本显示文本内容,子线程会更新这个文本,并同步显示

1,类里面写一个委托函数
delegate void SetShowLogCallback();   //定义委托


2,程序load执行方法
private void Form1_Load(object sender, EventArgs e)
        {
            showSynchLog();
       
        }

  方法内容如下
 /**
         * 显示同步日志内容
         * **/
        private void showSynchLog() {
            TxtUtil txtUtil = new TxtUtil(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + Glob.LOG_NAME);
            List<LogTxt> logTxts = txtUtil.readLastLineLogTxt(10);

            if (data_log.InvokeRequired)
            {   //控件是否跨线程?如果是,则执行括号里代码
                SetShowLogCallback setShowLogCallBack = new SetShowLogCallback(showSynchLog);

                data_log.Invoke(setShowLogCallBack);
            }
            else {
                data_log.DataSource = logTxts;
            }

            //设置列名内容居中
            data_log.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            data_log.Columns[0].HeaderText = "更新时间";
            //设置列宽自动适应
            data_log.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            //设置文本只可读
            data_log.Columns[0].ReadOnly = true;
            //设置文本内容居左
            data_log.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;

            data_log.Columns[1].HeaderText = "更新内容";
            //设置列宽自动适应
            data_log.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            //设置文本只可读
            data_log.Columns[1].ReadOnly = true;
            //设置文本内容居左
            data_log.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
        }


3,子线程去同步调用显示日志的方法
/**
         * 书写同步日志
         * **/
        private void writeSynchLog() {
            // 更新结束写同步日志,然后更新同步数据为0方便第二天再同步
            TxtUtil txtUtil = new TxtUtil(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + Glob.LOG_NAME);
            txtUtil.InsertLine(DateTime.Now.ToString("yyy-MM-dd HH:mm:ss") + "#" + "本次插入" + insertPregnancyingCount + "条在孕孕情," + insertPregnancyendCount + "条终止孕情;更新" + updatePregnancyingCount + "条在孕孕情," + updatePregnancyendCount + "条终止孕情!");
            txtUtil.Save();
            showSynchLog();
        }
分享到:
评论

相关推荐

    C# 子线程调用主线程窗体的解决方法

    由于Windows窗体控件本质上不是线程安全的。...  这种方法我没用过,因为大家推荐不要使用,所以我没去实验过,具体方法如下(摘自网上):  设置System.Windows.Forms.Control.CheckForIllegalCrossTh

    C# 主线程显示数据,子线程获取数据

    总结来说,C#中的异步委托是实现主线程显示数据、子线程获取数据的关键技术。通过合理运用异步编程,可以显著提升用户体验,避免UI卡顿,同时确保后台任务的顺利执行。理解并熟练掌握这种编程模式,对于开发高效且...

    C#子线程执行完后通知主线程的方法

    在这个场景下,我们可以通过委托或.NET框架提供的Action和Func泛型委托来传递回调函数,从而让子线程在完成后调用主线程定义的方法。 下面是一个使用自定义委托的例子: ```csharp public delegate void Entrust...

    C#利用子线程刷新主线程分享教程

    与`GetTime`方法类似,`ShowResult`也需要检查`InvokeRequired`,并根据情况使用`Invoke`来确保在主线程中安全更新`txtResult`控件。 3. **使用`Application.DoEvents()`**: 在`GetTime`和`Add`方法中,调用了`...

    Android主线程和子线程区别详解

    2. 当需要在子线程中修改UI时,例如改变Label的文本,需要使用this.Invoke方法,它将方法的执行委托回主线程,确保UI更新的安全性。 3. 示例中的getLabel方法在一个循环中调用了this.Invoke,每次循环都会更新UI,...

    C#?副线程调用主线程的控件

    副线程调用主线程的控件时,`Invoke`方法会阻塞副线程,直到主线程执行完指定的委托。这样可以确保在多线程环境中对UI控件的修改是线程安全的。此外,如果你需要执行异步操作,可以使用`BeginInvoke`,它会在主线程...

    VS2017-MFC子线程中更新控件的内容框架代码

    这样,当子线程调用`UpdateCtrlContent()`时,消息会被安全地发送到主线程,由主线程处理并更新控件内容。 在提供的压缩包文件"MFCAppThread1"中,可能包含了完整的示例代码,包括项目文件、源代码文件以及必要的...

    C#委托使用详解(Delegates)

    委托的主要作用在于实现线程间通信,比如在WinForm开发中,子线程无法直接调用主线程的方法,就需要借助委托。此外,委托还可以作为方法参数,使得我们可以传递行为,而不是数据。 初始化委托变量有两种方式:一种...

    c# winform异步不卡界面的实现方法

    因此,我们需要使用委托来实现子线程更新主线程。 下面是一个简单的示例代码,演示如何使用异步编程来避免界面卡死。 ```csharp public delegate void UpdateText(string message); public void UpdateTextMehod...

    vb.net 委托与非委托对线程的影响

    通过委托,我们可以在不影响主线程(UI线程)性能的情况下,安全地在子线程上执行计算密集型任务,并确保UI的及时更新。同时,避免在非UI线程上直接操作UI控件,能有效防止潜在的线程安全问题。正确地使用委托和线程...

    WindowsTest.7z

    4. **事件回调**:子线程可能通过事件或者委托机制将结果返回到主线程,以便在主线程上更新UI。这是因为Windows窗体控件不是线程安全的,所有对UI的操作必须在主线程中进行。 5. **异常处理**:多线程环境中,异常...

    详解C#中通过委托来实现回调函数功能的方法

    当操作完成后,我们通过调用`writeTextBox`委托将结果(字符`'A'`)传递回主线程,以更新UI。由于UI控件不是线程安全的,我们使用了`Invoke`方法来确保在正确的线程上执行回调。 总结起来,C#中的委托提供了实现回...

    .net版本简单线程调用源码

    Console.WriteLine("主线程正在执行..."); // 等待子线程完成 myThread.Join(); Console.WriteLine("所有线程执行完毕"); } // 线程函数 static void MyThreadFunction() { Console.WriteLine("子线程...

    C#多线程解决界面卡死问题的完美解决方案

    主线程通常负责UI的更新,而其他工作线程用于执行耗时任务,这样可以保证主线程不被阻塞,保持UI的流畅。 二、线程创建与管理 1. 使用`Thread`类:可以直接创建`Thread`对象,通过传递委托到构造函数来指定线程执行...

    双色球查询字典子线程查询以及跨线程访问控件

    其次,“子线程查询”意味着程序在后台线程(非UI线程)上执行查询操作,以避免阻塞主线程(UI线程),导致用户界面无响应。这是提高用户体验的重要手段,因为查询可能涉及到复杂的计算或网络通信,这些操作不应在...

    c#中如何控制模态子窗体中的进度条

    1. 定义一个委托类型,例如`dSetProgress`,用于在子线程中调用主线程更新UI。委托是C#中的多播函数指针,可以用于传递方法作为参数。 ```csharp public delegate void dSetProgress(int total, int current); ``` ...

    VB多线程方式同时进行多项任务

    同时,主线程与子线程间的通信也需要谨慎处理,避免出现死锁或竞态条件。 总结来说,VB实现多线程的方式包括API调用和.NET Framework提供的工具。对于VB6,需要借助API函数;而在VB.NET中,我们可以利用Thread类、...

    ios object-c 面试试题 及答案

    子线程与主线程交互,比如更新UI,需要使用`performSelectorOnMainThread:`或`dispatch_async`到主线程队列。 6. **iPhone的内存管理机制**: iOS使用ARC(Automatic Reference Counting)自动管理内存。对象的...

    利用多线程句柄设置鼠标忙碌状态的实现方法

    当我们希望在主线程(UI线程)上设置鼠标为忙碌状态,同时在后台线程执行长时间运行的任务时,多线程句柄就派上用场了。 以下是一个简单的例子,展示了如何在C# WinForms应用程序中实现这一功能: 1. 创建一个委托...

    Mult-ping.rar_VB程序Ping_ping_vb ping _vb 多线程_vb多线程

    6. **事件和回调**:线程间的通信可以通过事件和事件处理函数实现,这样主线程可以知道子线程何时完成任务,或者获取ping的结果。 7. **线程池ThreadPool**:为了优化线程的创建和销毁,可以考虑使用线程池。VB.NET...

Global site tag (gtag.js) - Google Analytics