Tag: 调用

C#如何使用reflection调用字段初始值设定项?

说我有这个C#类 public class MyClass { int a; int[] b = new int[6]; } 现在说我发现这个类使用reflection,在查看字段时,我发现其中一个是Array类型(即:b) foreach( FieldInfo fieldinfo in classType.GetFields() ) { if( fieldInfo.FieldType.IsArray ) { int arraySize = ?; … } } 我知道不能保证数组有一个创建数组的字段初始值设定项,但如果确实如此,我想知道字段初始值设定项创建的数组的大小。 有没有办法调用字段初始化程序? 如果有,我会做这样的事情: Array initValue = call field initializer() as Array; int arraySize = initValue.Length; 我发现唯一的是创建一个全class的实例,但我宁愿不这样做,因为它太过分了……

使用Invoke进行父窗体或目标控件之间有什么区别吗?

如果我想从另一个线程处理控件,检查InvokeRequired和调用控件的Invoke方法和父窗体的区别是什么? if (theForm.InvokeRequired) Invoke(…) 要么 if (myControl.InvokeRequired) myControl.Invoke(…) 来自MSDN : Invoke方法搜索控件的父链,直到找到具有窗口句柄的控件或窗体(如果当前控件的基础窗口句柄尚不存在)。

在调用`Invoke`时避免`ObjectDisposedException`

我有2个表单,一个是MainForm ,第二个是DebugForm 。 MainForm有一个按钮,可以像这样设置和显示DebugForm,并传递对已经打开的SerialPort的引用: private DebugForm DebugForm; //Field private void menuToolsDebugger_Click(object sender, EventArgs e) { if (DebugForm != null) { DebugForm.BringToFront(); return; } DebugForm = new DebugForm(Connection); DebugForm.Closed += delegate { WindowState = FormWindowState.Normal; DebugForm = null; }; DebugForm.Show(); } 在DebugForm中,我附加了一个方法来处理serialport连接的DataReceived事件(在DebugForm的构造函数中): public DebugForm(SerialPort connection) { InitializeComponent(); Connection = connection; Connection.DataReceived += Connection_DataReceived; } 然后在Connection_DataReceived方法中,我更新DebugForm中的TextBox,即使用Invoke进行更新: private […]

根据c#中的用户输入解析为原始类型

我这样做的代码使用我给它的reflection和字符串,而不是用户输入。 最终我希望用户能够说“浮动”“2.0”并让计算机说,是的,这是一个浮动,或计算机会说的“bool”“abc”,这是没有听说过的布尔值。 获取用户输入并将其转换为基本类型名称是很简单的,例如“string”到“System.String”,“float”到“System.Single”等等(尽管如果你知道一个函数要做到这一点,那也会很棒。) 这是代码: Console.WriteLine(“1.0 => {0}”, System.Single.Parse(“1.0”)); // this works fine. Type t = Type.GetType(“System.Single”); // for parsing floats MethodInfo mi = t.GetMethod(“System.Single.Parse”); // “ambiguous” if use “Parse” object[] parameters = new object[] { “1.0” }; float f = (float)(mi.Invoke(null, parameters)); // get null exception here. Console.WriteLine(“Was succesfully parsed to: ” + f); 但是我在第二行到最后一行继续得到一个空例外。 […]

需要帮助在UI线程和C#中的另一个线程获取信息

我有一个服务器应用程序,通过网络接收信息并进行处理。 服务器是multithreading的,并且一次处理多个套接字,并且通过BeginInvoke和EndInvoke样式方法在没有我控制的情况下创建线程,这些方法由相应的回调函数链接。 我正在尝试创建一个表单,除了主GUI之外,它还显示一个ListBox项目,该项目由描述当前连接的套接字的项目填充。 所以,我基本上要做的是使用其Add()函数向ListBox添加一个项目,从该线程运行相应的回调函数。 我通过Controls属性访问我的表单控件 – IE: (ListBox)c.Controls[“listBox1”].Items.Add(); 当然我不只是调用函数,我已经尝试了几种方法,我在这里和网上在线程之间进行通信,包括MethodInvoker ,使用delegate ,结合Invoke() , BeginInvoke()等。似乎工作,我总是得到相同的exception告诉我我的控件是从一个线程访问,而不是它创建的线程。 有什么想法吗?

从Invoke方法获取RETURN

我试图从另一个线程上的列表框项读取值。 我试图创建一个新的方法来运行invoke命令,我可以设法发送命令到列表框,如通过调用方法添加,但我似乎无法得到响应,我似乎无法得到项目的价值,我尝试了几种方法,一旦我将它从一个空格改为一个字符串,事情开始变得毛茸茸…… thread t1 = new thread(thethread) t1.start() public void thethread() { string text = readListBoxSelected(listBox1) + ” lala” ; } public static string readListBoxSelected(ListBox listbox) { if (listbox.InvokeRequired) { return (string)listbox.Invoke( new Func(() => readListBoxSelected(listbox)) ); } else { string varText = listbox.SelectedValue.ToString(); return varText; } } 以上是我想要做的一个例子。 这是错误: System.NullReferenceException未被用户代码处理 Message =对象引用未设置为对象的实例。 Source = […]

C#/ WinForms:ShowDialog和随后的表格显示

由于我认为与此无关的原因,我有一个或多个与单个实例UI(表单)通信的线程。 在工作线程中,我需要报告进度或输入数据或简单选择。 所有这些都来自用户与UI的交互,当然,对于M $ .NET,所有UI都在主线程中运行。 显然,我需要处理UI(主)线程和工作线程之间的线程同步。 我通过正确validationInvokeRequired和公司来做到这一点。 在那里有一些文章和文章讨论InvokeRequired , IsHandleCreated , IsDisposed等中的不一致和细微之处,所以我不会谈论它。 我只需要说我的UI,即只是一个Form,应该显示为模态或无模式 ,具体取决于调用者的愿望。 一个可能只是UI.Warn( “Warning!” )而其他可能是UI.Question( “Make a choice:”, options… ) 。 现在考虑下面的M $ DN文档摘录: Form.ShowDialog方法: 与非模态表单不同,当用户单击关闭表单按钮时,.NET Framework不会调用Close方法… 我从未参加过一个显示为模态的表单,但是他们的实现者说它不会被破坏,在关闭(隐藏)后可能会处于不可用的状态。 但确实如此! 当表单从ShowDialog( )返回时,它的Handle被删除了,因为它相信当再次需要它时,将调用ShowDialog( )并重新创建句柄。 我不知道为什么M $的东西需要这样做,但我只是觉得我能够拥有完全像模态或无模式的完全相同的forms而没有问题。 M $ DN docs没有说它是被禁止的(或者我太醉了而无法找到它)! 好吧,最后它是一种相对简单(和肮脏)的方法来修复它。 var r = ShowDialog( ); // Handle thrown away aftr “ShowDialog()” supposing the // […]

在muticast委托上使用慢速DynamicInvoke的替代方法

我在基类中有以下代码: public static void InvokeExternal(Delegate d, object param, object sender) { if (d != null) { //Check each invocation target foreach (Delegate dDelgate in d.GetInvocationList()) { if (dDelgate.Target != null && dDelgate.Target is System.ComponentModel.ISynchronizeInvoke && ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).InvokeRequired) { //If target is ISynchronizeInvoke and Invoke is required, invoke via ISynchronizeInvoke ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).Invoke(dDelgate, new object[] { sender, param }); […]

为什么VS2010总是在MethodInfo.Invoke的exception中断?

我有一个关于MethodInfo.Invoke(o,null)的try / catch,并且VS2010被设置为永远不会在Exceptions上中断,但不幸的是调试器继续在Invoked方法内部中断。 该方法是静态的,我已经安装了Phone Developer Beta。 这是错误还是开发人员错误? 谢谢!!

哪个C#程序集包含Invoke?

替代问题:为什么VS10如此热衷于抱怨Invoke? 在我不断追求让我的应用程序成为世界上最好的C#程序员的过程中,我认为线程是一件好事。 MSDN有一篇关于对控件进行线程安全调用的有用文章,但它(以及看似关于该主题的所有其他文章)倾斜地引用了一个名为Invoke的方法。 有时甚至是BeginInvoke, 我读过的也是首选 。 如果我能让visual studio识别Invoke,那么这一切都会很棒。 MSDN说它包含在System.Windows.Forms程序集中 ,但我已经’使用’了。 可以肯定的是,我也尝试过使用System.Threading,但无济于事。 我需要通过哪些环节才能调用工作?