Tag: 调用

设置WinForms.Form所有者时的跨线程exception – 如何正确执行?

我有一个主UI线程,它运行应用程序并创建主窗口表单(让我们称之为W )。 我还有一个辅助线程,我旋转并创建一个对话框(让我们称之为B )。 我想将对话框B的所有者设置为主窗口W B s所有者的设置发生在创建B的线程上。 基本上: b.Owner = w; 但这会引发一个跨线程exception,告诉我我正在尝试从错误的线程访问W对象。 所以我试图通过在W上使用Control.Invoke在主UI线程上执行代码。 但是,我得到了同样的错误,告诉我我正在尝试从错误的线程访问B : System.InvalidOperationException was unhandled by user code Message=Cross-thread operation not valid: Control ‘B’ accessed from a thread other than the thread it was created on. Source=System.Windows.Forms 我该怎么做呢?

我在Windows窗体中的跨线程调用有什么问题?

我遇到Windows窗体应用程序的问题。 必须从另一个线程显示一个表单。 所以在表单类中,我有以下代码: private delegate void DisplayDialogCallback(); public void DisplayDialog() { if (this.InvokeRequired) { this.Invoke(new DisplayDialogCallback(DisplayDialog)); } else { this.ShowDialog(); } } 现在,每次运行它时,都会在this.ShowDialog();行上抛出InvalidOperationException this.ShowDialog(); : “跨线程操作无效:控制’SampleForm’从其创建的线程以外的线程访问。” 这段代码出了什么问题? 这不是一种有效的跨线程调用方式吗? ShowDialog()有什么特别之处吗?

参数计数与Invoke不匹配?

下面的代码块导致错误:TargetParameterCountException未被用户代码处理。 参数计数不匹配。 public void AddListViewItem(string[] Data) { if (InvokeRequired) { Invoke(new Action(AddListViewItem), Data); } else { ListViewData.Items.Add(Data[0]).SubItems.AddRange ( new string[] { Data[1], Data[2], Data[3], } ); } } 有任何想法吗?

delegate.Invoke是如何工作的?

如果我在我的代码中创建一个委托,如: delegate void dostuff (string o); 这将生成一个派生自System.MulticastDelegate的类,该类实现三个方法Invoke , BeginInvoke和EndInvoke 。 如果我查看已编译的IL for Invoke我看到的是: .method public hidebysig newslot virtual instance void Invoke(string o) runtime managed { } // end of method dostuff::Invoke 该方法不包含代码。 调用它确实有效 – 代理被调用,但我看不出它是如何做到的。 调用Invoke的伏都教在哪里实际调用委托来自哪里?

C#Winforms线程:调用Closed Form

以下代码说明了我的困境。 代码创建一个处理内容的后台线程,然后使用结果调用UI线程。 如果后台线程在窗体关闭后调用窗体上的Invoke,它可能会抛出exception。 它在调用Invoke之前检查IsHandleCreated,但是在检查之后表单可能会关闭。 void MyMethod() { // Define background thread Action action = new Action( () => { // Process something var data = BackgroundProcess(); // Try to ensure the form still exists and hope // that doesn’t change before Invoke is called if (!IsHandleCreated) return; // Send data to UI thread for processing […]

如何从除创建它之外的线程读取combobox?

我试图从一个线程读取一个combobox.Text而不是它创建的线程,但我收到错误: System.Windows.Forms.dll中发生了未处理的“System.InvalidOperationException”类型exception 附加信息:跨线程操作无效:控制’levelsComboBox’从其创建的线程以外的线程访问。 我之前使用过.Invoke但只是设置属性,我怎样才能用它来读取combobox.Text? 因为.Invoke返回void,我需要一个字符串。 或者没有Invoke有另一种方法吗?

我应该使用Invoke或SynchronizationContext来更新另一个线程的表单控件吗?

试图从其他线程更新UI控件。 目前正在使用BeginInvoke,老实说它工作正常,但我一直听说你如何使用SynchronizationContext来做同样的事情。 哪个更受欢迎? 另外,从线程更新UI是不好的做法吗? 提出一个事件并让主要forms处理它或者还有其他更好的方法来做这件事会更好吗? 对于这个有点主观的问题感到抱歉,但是在线程领域有很多选择,我正在努力把握它们之间的差异以及它们各自适用的位置,以及为将来编写可读和可扩展代码的最佳实践。 编辑:现在我也看到还有TaskScheduler.FromCurrentSynchronizationContext路由..这么多选择x_x

如何使用带有C#/ .NET的Reflection实例化程序集中的类?

我有这个库编译为calc.dll。 namespace MyClass { public class Calculator { public int Value1 {get; set;} public int Value2 {get; set;} public Calculator() { Value1 = 100; Value2 = 200; } public int Add(int val1, int val2) { Value1 = val1; Value2 = val2; return Value1 + Value2; } } } 我想实例化Calculate类而不链接到calc.dll。 C#可以做到吗? 我想出了这个代码,但我不知道如何实例化Calculator类。 using System; using System.IO; […]

MethodInfo.Invoke性能问题

我正在读取文件和从文件写入数据。 文件中的数据可以是浮点数,双精度数,整数等。直到运行时才知道该类型。 我将存储在文件中的数据类型称为Tin。 数据被读入或写入Tout类型的数组。 直到运行时才知道这种类型。 代码序列是这样的。 在Open方法中,Tin和Tout是已知的,我们可以为已知数据类型创建读写方法。 Open(…) { MethodInfo ReadMethod = typeof(…)GetMethod(“ReadGeneric”).MakeGenericMethod(new Type[] {typeof(Tin), typeof(Tout)})); } 读写循环重复数百万次,并依赖于reflection来调用适当的方法,如下所示。 Read loop { var values = (Tout[])ReadMethod.Invoke(this,new object[]{index}); process … } 当使用性能分析器检查此代码时,如果只花时间调用运行时读写方法,我会发现c collosal amount。 我该如何加快速度呢?

有没有办法在C#中检查运行时的堆栈变量?

有没有办法在运行时转储堆栈的内容? 我对父函数信息(名称,参数,行)感兴趣,我知道我可以使用StackTrace和StackFrame类。 但是,我还想获取堆栈中的变量(在调用当前执行的方法中声明的局部变量)。 由于Visual Studio调试器可以执行此操作,我认为可能有一种方法也可以在运行时在代码中执行此操作。 有这样的方式吗?