主线程读取文本显示文本内容,子线程会更新这个文本,并同步显示
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();
}
分享到:
相关推荐
由于Windows窗体控件本质上不是线程安全的。... 这种方法我没用过,因为大家推荐不要使用,所以我没去实验过,具体方法如下(摘自网上): 设置System.Windows.Forms.Control.CheckForIllegalCrossTh
总结来说,C#中的异步委托是实现主线程显示数据、子线程获取数据的关键技术。通过合理运用异步编程,可以显著提升用户体验,避免UI卡顿,同时确保后台任务的顺利执行。理解并熟练掌握这种编程模式,对于开发高效且...
在这个场景下,我们可以通过委托或.NET框架提供的Action和Func泛型委托来传递回调函数,从而让子线程在完成后调用主线程定义的方法。 下面是一个使用自定义委托的例子: ```csharp public delegate void Entrust...
与`GetTime`方法类似,`ShowResult`也需要检查`InvokeRequired`,并根据情况使用`Invoke`来确保在主线程中安全更新`txtResult`控件。 3. **使用`Application.DoEvents()`**: 在`GetTime`和`Add`方法中,调用了`...
2. 当需要在子线程中修改UI时,例如改变Label的文本,需要使用this.Invoke方法,它将方法的执行委托回主线程,确保UI更新的安全性。 3. 示例中的getLabel方法在一个循环中调用了this.Invoke,每次循环都会更新UI,...
副线程调用主线程的控件时,`Invoke`方法会阻塞副线程,直到主线程执行完指定的委托。这样可以确保在多线程环境中对UI控件的修改是线程安全的。此外,如果你需要执行异步操作,可以使用`BeginInvoke`,它会在主线程...
这样,当子线程调用`UpdateCtrlContent()`时,消息会被安全地发送到主线程,由主线程处理并更新控件内容。 在提供的压缩包文件"MFCAppThread1"中,可能包含了完整的示例代码,包括项目文件、源代码文件以及必要的...
委托的主要作用在于实现线程间通信,比如在WinForm开发中,子线程无法直接调用主线程的方法,就需要借助委托。此外,委托还可以作为方法参数,使得我们可以传递行为,而不是数据。 初始化委托变量有两种方式:一种...
因此,我们需要使用委托来实现子线程更新主线程。 下面是一个简单的示例代码,演示如何使用异步编程来避免界面卡死。 ```csharp public delegate void UpdateText(string message); public void UpdateTextMehod...
通过委托,我们可以在不影响主线程(UI线程)性能的情况下,安全地在子线程上执行计算密集型任务,并确保UI的及时更新。同时,避免在非UI线程上直接操作UI控件,能有效防止潜在的线程安全问题。正确地使用委托和线程...
4. **事件回调**:子线程可能通过事件或者委托机制将结果返回到主线程,以便在主线程上更新UI。这是因为Windows窗体控件不是线程安全的,所有对UI的操作必须在主线程中进行。 5. **异常处理**:多线程环境中,异常...
当操作完成后,我们通过调用`writeTextBox`委托将结果(字符`'A'`)传递回主线程,以更新UI。由于UI控件不是线程安全的,我们使用了`Invoke`方法来确保在正确的线程上执行回调。 总结起来,C#中的委托提供了实现回...
Console.WriteLine("主线程正在执行..."); // 等待子线程完成 myThread.Join(); Console.WriteLine("所有线程执行完毕"); } // 线程函数 static void MyThreadFunction() { Console.WriteLine("子线程...
主线程通常负责UI的更新,而其他工作线程用于执行耗时任务,这样可以保证主线程不被阻塞,保持UI的流畅。 二、线程创建与管理 1. 使用`Thread`类:可以直接创建`Thread`对象,通过传递委托到构造函数来指定线程执行...
其次,“子线程查询”意味着程序在后台线程(非UI线程)上执行查询操作,以避免阻塞主线程(UI线程),导致用户界面无响应。这是提高用户体验的重要手段,因为查询可能涉及到复杂的计算或网络通信,这些操作不应在...
1. 定义一个委托类型,例如`dSetProgress`,用于在子线程中调用主线程更新UI。委托是C#中的多播函数指针,可以用于传递方法作为参数。 ```csharp public delegate void dSetProgress(int total, int current); ``` ...
同时,主线程与子线程间的通信也需要谨慎处理,避免出现死锁或竞态条件。 总结来说,VB实现多线程的方式包括API调用和.NET Framework提供的工具。对于VB6,需要借助API函数;而在VB.NET中,我们可以利用Thread类、...
子线程与主线程交互,比如更新UI,需要使用`performSelectorOnMainThread:`或`dispatch_async`到主线程队列。 6. **iPhone的内存管理机制**: iOS使用ARC(Automatic Reference Counting)自动管理内存。对象的...
当我们希望在主线程(UI线程)上设置鼠标为忙碌状态,同时在后台线程执行长时间运行的任务时,多线程句柄就派上用场了。 以下是一个简单的例子,展示了如何在C# WinForms应用程序中实现这一功能: 1. 创建一个委托...
6. **事件和回调**:线程间的通信可以通过事件和事件处理函数实现,这样主线程可以知道子线程何时完成任务,或者获取ping的结果。 7. **线程池ThreadPool**:为了优化线程的创建和销毁,可以考虑使用线程池。VB.NET...