C#子线程的控件操作问题解析

有关C#子线程的控件操作

一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线 程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是 不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了 Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。

现在用一个用线程控制的进程条来说明,大致的步骤如下:

1.创建Invoke函数,大致如下:

/// < summary>
/// Delegate function to be invoked by main thread
/// < /summary>
private void InvokeFun()
{
    if( prgBar.Value <  100 )
        prgBar.Value = prgBar.Value + 1;
}

2.C#子线程入口函数:

/// < summary>
/// Thread function interface  
/// < /summary>

private

void
 ThreadFun()
{
    //Create invoke method by specific function
    MethodInvoker mi =
new
 MethodInvoker(
this
.InvokeFun );

for
(
int
 i = 0; i <  100; i++ )
    {

this
.BeginInvoke( mi );
        Thread.Sleep( 100 );
    }
}

3.创建C#子线程:

Thread thdProcess =
new
 Thread(
new
 ThreadStart( ThreadFun ) );
thdProcess.Start();

备注:

using
 System.Threading;

private
 System.Windows.Forms.ProgressBar prgBar;

时间: 2024-10-31 12:44:03

C#子线程的控件操作问题解析的相关文章

在c#中关于线程调用控件

由于c#不允许非创造控件线程调用控件,所以遇到过很多问题. 提示: 线程间操作无效: 从不是创建控件"showtable_btn"的线程访问它. 有些小郁闷 因为是刚刚使用thread 原始代码大概如下 private void showtable_btn_Click(object sender, EventArgs e) { thread t = new thead(s) t.start() }   private void s() { textbox1.text = "w

C# 跨线程调用控件

原文:C# 跨线程调用控件 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法   阅读目录 线程间操作无效 第一种办法:禁止编译器对跨线程访问做检查 第二种办法: 使用delegate和invoke来从其他线程中调用控件 第三种办法: 使用delegate和BeginInvoke来从其他线程中控制控件 第四种办法: 使用BackgroundWorker组件 源代码下载   线程间操作无效

.net3.0中跨线程访问控件

这两天用WPF做一个项目的UI部分时, 发现跨线程地访问了UI控件, 自然地报异常了. 当时找了半天也没在控件中找到InvokeRequired属性和Invoke方法, 郁闷之极.....最后发现在.net3.0中,这有所改变了. 替代InvokeRequired的方法是DispatcherObject.CheckAccess()或DispatcherObject.VerifyAccess()方法,用于指示当前线程是否可以直接访问控件. 替代Invoke的方法是DispatcherObject.

MFC父窗口控制子窗口CListCtrl控件刷新的问题

问题描述 MFC父窗口控制子窗口CListCtrl控件刷新的问题 目标:父窗口单击按钮,向子窗口发送一个消息:子窗口的消息处理函数中,调用列表显示函数来刷新列表数据. 我的代码: // 父窗口void CDlg4::OnButtonClick(){ CDlg43 *dlg = new CDlg43(); dlg->Create(IDD_DIALOG_43this); if (NULL == dlg) { AfxMessageBox(""failed""); d

控件显示-新手求助,VS调用子窗体时控件莫名其妙不见了

问题描述 新手求助,VS调用子窗体时控件莫名其妙不见了 我的主窗体的控件运行了还在,但调用的子窗体的控件就是不见了,在designer页面里也没有找到错误,快哭了,求拯救啊,还急着交作业...用的是VS2010 解决方案 是不是可见属性没设置正确啊

listbox-C# 不同命名空间的控件操作

问题描述 C# 不同命名空间的控件操作 MainForm是一个主窗口,有一个ListBox控件,再另一个命名空间Plugin中需要操作MainForm中的ListBox.Items.Add(). 求助. 解决方案 不同命名空间不是问题,只要using这个空间就可以了. 问题是,你在Plugin中如何访问ListBox,我不建议你让Plugin维持一个指向MainForm的引用,或者让它来找MainForm,那样"插件"就和主程序紧密耦合在一起了. 正确的做法是主窗口传一个委托,将上下文

Android 中 SwipeLayout一个展示条目底层菜单的侧滑控件源码解析_Android

由于项目上的需要侧滑条目展示收藏按钮,记得之前代码家有写过一个厉害的开源控件 AndroidSwipeLayout 本来准备直接拿来使用,但是看过 issue 发现现在有不少使用者反应有不少的 bug ,而且代码家现在貌似也不进行维护了.故自己实现了一个所要效果的一个控件.因为只是实现我需要的效果,所以大家也能看到,代码里有不少地方我是写死的.希望对大家有些帮助.而且暂时也不需要 AndroidSwipeLayout 大而全的功能,算是变相给自己做的项目精简代码了. 完整示例代码请看:GitHu

分析SpinnerActivityTest中有关控件操作以及UI线程问题

首先说明,SpinnerActivityTest是官方给的单元测试sample. 继承自ActivityInstrumentationTestCase2进行activity测试.涉及到对控件的操作时比如处理动作,触屏和按键事件,和锁屏.,必须在mActivity.runOnUiThread()程序线程中 (或者在测试函数上添加@UiThreadTest,那么整个函数将在UI线程中运行),而不是在测试线程中 比如: mActivity.runOnUiThread(             new

windows跨线程调用控件的方法

用户不喜欢反应慢的程序.在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速.在Windows 中进行多线程编程曾经是 C++ 开发人员的专属特权,但是现在,可以使用所有兼容 Microsoft .NET 的语言来编写. 不过Windows 窗体体系结构对线程使用制定了严格的规则.如果只是编写单线程应用程序,则没必要知道这些规则,这是因为单线程的代码不可能违反这些规则.然而,一旦采用多线程,就需要理解 Windows 窗体中最重要的一条线程规则