`
helloyesyes
  • 浏览: 1304260 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C#中在线程中访问主Form控件的问题

阅读更多

C#不允许直接从线程中访问Form里的控件,比如希望在线程里修改Form里的一个TextBox的内容等等,唯一的做法是使用Invoke方法,下面是一个MSDN里的Example,很说明问题:

usingSystem;
usingSystem.Drawing;
usingSystem.Windows.Forms;
usingSystem.Threading;

publicclassMyFormControl:Form
...{
publicdelegatevoidAddListItem(StringmyString);
publicAddListItemmyDelegate;
privateButtonmyButton;
privateThreadmyThread;
privateListBoxmyListBox;
publicMyFormControl()
...{
myButton
=newButton();
myListBox
=newListBox();
myButton.Location
=newPoint(72,160);
myButton.Size
=newSize(152,32);
myButton.TabIndex
=1;
myButton.Text
="Additemsinlistbox";
myButton.Click
+=newEventHandler(Button_Click);
myListBox.Location
=newPoint(48,32);
myListBox.Name
="myListBox";
myListBox.Size
=newSize(200,95);
myListBox.TabIndex
=2;
ClientSize
=newSize(292,273);
Controls.AddRange(
newControl[]...{myListBox,myButton});
Text
="'Control_Invoke'example";
myDelegate
=newAddListItem(AddListItemMethod);
}

staticvoidMain()
...{
MyFormControlmyForm
=newMyFormControl();
myForm.ShowDialog();
}

publicvoidAddListItemMethod(StringmyString)
...{
myListBox.Items.Add(myString);
}

privatevoidButton_Click(objectsender,EventArgse)
...{
myThread
=newThread(newThreadStart(ThreadFunction));
myThread.Start();
}

privatevoidThreadFunction()
...{
MyThreadClassmyThreadClassObject
=newMyThreadClass(this);
myThreadClassObject.Run();
}

}

publicclassMyThreadClass
...{
MyFormControlmyFormControl1;
publicMyThreadClass(MyFormControlmyForm)
...{
myFormControl1
=myForm;
}

StringmyString;

publicvoidRun()
...{


for(inti=1;i<=5;i++)
...{
myString
="Stepnumber"+i.ToString()+"executed";
Thread.Sleep(
400);
//Executethespecifieddelegateonthethreadthatowns
//'myFormControl1'control'sunderlyingwindowhandlewith
//thespecifiedlistofarguments.
myFormControl1.Invoke(myFormControl1.myDelegate,
newObject[]...{myString});
}

}

}


分享到:
评论

相关推荐

    c#在多线程中访问Form中控件的多种解决方案

    ### C# 在多线程中访问 Form 中控件的多种解决方案 #### 背景与问题阐述 在 Windows Forms 应用程序开发中,多线程技术被广泛应用于提高应用程序的响应性和性能。然而,在多线程环境中访问 UI 控件(如 `TextBox`...

    c#多线程中子线程动态改变ui控件

    特别是在C#多线程编程中,子线程更新UI控件是一个常见的问题。本文将总结C#子线程更新UI控件的方法,介绍两种常用的方法,以便读者更好地理解和应用。 一、使用控件自身的Invoke/BeginInvoke方法 Control类实现了...

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    在上面的代码示例中,ThreadProcSafe方法将在后台线程中执行,并使用Invoke方法来设置TextBox控件的文本属性。这使得SetText方法被创建TextBox控件的线程调用,从而确保控件的状态是一致的。 此外,.NET Framework...

    C#跨线程访问控件

    当我们需要在一个非UI线程中修改UI控件的状态时,就会遇到跨线程访问问题。由于Windows消息循环机制,控件只能在其创建的线程(主线程)上被安全地访问。这就是著名的“控制台不是创建它的线程”的错误。为了解决这...

    c#跨线程跨类调用窗体控件

    在C#编程中,跨线程操作窗体控件是一个常见的需求,特别是在多线程环境中。标题提到的“c#跨线程跨类调用窗体控件”是指在一个线程(非UI线程)中,通过另一个类来操作属于UI线程的窗体控件,比如`Form1`中的`...

    c#在线程中使用控件时控件出现红叉解决方法.cs

    c#在线程中使用控件时控件出现红叉解决方法.cs

    C# 通过委托和线程实现chart控件的实时更新

    在多线程编程中,线程安全是一个非常重要的问题。在我们的示例代码中,我们使用了 BeginInvoke 方法来将数据绑定到 Chart 控件上,该方法具有线程安全性。BeginInvoke 方法将在控件的 UI 线程上执行委托,避免了跨...

    c#中使用多线程访问winform中控件的若干问题.doc

    "C#中使用多线程访问WinForm中控件的若干问题" 在C#中使用多线程访问WinForm中控件是一种常见的需求,然而这并不是一个简单的问题。WinForm中的控件并不支持多线程访问,尝试从其他线程中访问控件将会抛出异常...

    c# windows form 控件

    例如,使用BindingSource组件来连接控件与数据源,而不是直接在控件中操作数据。 4. 选择合适的控件:选择性能较好的控件类型。例如,ListView和DataGridView在大数据量显示时比ListBox和DataTable更快。 5. 控件...

    C# 线程A访问非线程A创建的控件 、 线程内创建窗体置顶显示ShowDialog

    总结,理解和熟练运用跨线程访问控件的机制,以及在特定线程中正确显示和管理窗体,对于编写高效、健壮的多线程C#应用程序至关重要。通过合理利用`Invoke`、`BeginInvoke`、`Dispatcher`和`SynchronizationContext`...

    C# Winform线程创建子窗体

    在C# Winform开发中,多线程技术是不可或缺的一部分,尤其当涉及到用户界面(UI)的异步操作时。线程允许程序同时执行多个任务,提高应用的响应性和效率。本话题将深入探讨如何利用线程来延迟创建子窗体,并且如何安全...

    C# Winform 多线程下载

    为了在Winform中实现多线程下载,我们需要创建一个窗体(Form)并在其中添加必要的控件,如按钮、进度条等,用于用户交互和显示下载状态。同时,我们需要创建一个后台线程来进行实际的文件下载操作,以避免阻塞UI...

    Form2调用Form1控件的解决方案

    接下来的问题是:如何实现在`Form2`中的某个操作能够反过来影响`Form1`中的某些控件状态或行为?这个问题在多窗体应用中十分常见且实用。 #### 解决方案概述 本文将详细介绍一种通过使用C#中的引用参数(`ref`)来...

    跨线程访问Windows窗体控件

    在Windows应用程序开发中,尤其是使用.NET Framework的Windows Forms平台,我们经常会遇到跨线程访问窗体控件的问题。这是因为Windows Forms控件默认是线程安全的,只能由创建它们的线程进行修改。如果尝试从其他...

    C#多线程之如何弹出一个模式窗口来显示进度条

    在C#编程中,多线程技术是一种常见且强大的工具,用于提高应用程序的性能和响应性。当一个耗时的任务需要执行时,如文件读写、网络请求或复杂的计算,多线程可以使用户界面(UI)保持流畅,不被长时间阻塞。在本教程...

    c#跨线程间控件调用

    由于Windows窗体控件(WinForms)本身并不是线程安全的,因此在多线程环境下访问这些控件时需要特别注意。不当的操作可能会导致控件进入不一致的状态、竞争条件甚至是死锁等问题。本文将详细介绍几种常见的跨线程...

    从线程操作主窗体控件

    在编程中,特别是Windows应用程序开发,我们经常遇到多线程环境下的UI操作问题。标题"从线程操作主窗体控件"所涉及的核心知识点是线程同步与UI线程安全。描述中提到的错误“线程间操作无效 从不是创建控件“___”的...

    C# WinForm多线程防止界面假死源码

    在C#编程中,WinForm应用常常需要处理耗时的操作,如大数据处理...总的来说,这个资源为初学者提供了一个很好的起点,通过实际代码来学习和掌握WinForm应用中多线程的使用,有助于他们更好地理解和应用并发编程的概念。

    C#子线程更新UI控件的方法实例总结

    在C#编程中,特别是在开发桌面应用程序(如WinForms或WPF)时,经常会遇到需要在子线程中更新UI控件的情况。由于UI界面通常运行在主线程中,为保证用户界面的响应性和避免线程冲突,我们需要遵循特定的规则来安全地...

    form2 数据绑定到 form1 中的控件 (c#)

    5. **考虑线程安全**:如果在多线程环境中,确保在UI线程上执行任何更改控件的操作,以避免线程同步问题。 在实际开发中,你可能还需要考虑其他因素,如错误处理、数据验证和用户体验等。了解并熟练掌握数据绑定...

Global site tag (gtag.js) - Google Analytics