Tag: 调用

什么是调用?

什么是方法调用,control.invoke? 在编程中一般调用什么 例子 : MethodInvoker getValues = new MethodInvoker(delegate() { checkbox1Checked = checkbox1.Checked; textBox6Text = textBox6.Text; textBox7Text = textBox7.Text; textBox3Text = textBox3.Text; textBox1Text = textBox1.Text; textBox4Text = textBox4.Text; richTextBox1Text = richTextBox1.Text; textBox5Text = textBox5.Text; }); if (this.InvokeRequired) { this.Invoke(getValues); } else { getValues(); } 而且我也想知道MethodInvoker和InvokeRequired是什么意思?

来自control.Invoke((MethodInvoker)委托的返回值{/ * … * /};我需要一些解释

#1和#2之间有什么区别: 代码1(编译好): byte[] GetSomeBytes() { return (byte[])this.Invoke((MethodInvoker)delegate { GetBytes(); }); } byte[] GetBytes() { GetBytesForm gbf = new GetBytesForm(); if(gbf.ShowDialog() == DialogResult.OK) { return gbf.Bytes; } else return null; } 代码2(没有成功) int GetCount() { return (int)this.Invoke((MethodInvoker)delegate { return 3; }); } 代码#2给了我, 因为’System.Windows.Forms.MethodInvoker’返回void,返回关键字后面不能跟一个对象表达式 。 我该如何解决? 为什么(做)编译器认为代码#1是对的?

使用参数动态调用dll和方法

基本上我试图通过名称调用一个DLL,实例化一个对象,然后在该DLL中按名称调用一个方法。 我得到了一个“调用目标引发了exception。” 在Method.Invoke期间。 我很确定我的问题是对方法的参数进行类型转换。 我想知道是否有人对此exception有任何意见。 此外,欢迎任何有关如何修改我的方法的建议。 public void calldll(string dllName, string typeName, string methodName, string arguments) { string[] argumentArray = arguments.Split(new char[] { ‘|’ }, StringSplitOptions.None); Assembly assembly = Assembly.LoadFrom(dllName); System.Type type = assembly.GetType(typeName); Object o = Activator.CreateInstance(type); MethodInfo method = type.GetMethod(methodName); ParameterInfo[] parameters = method.GetParameters(); object[] methodParameters = new object[parameters.GetLength(0)]; for (int i = […]

使用来自C#中不同线程的Invoke访问类成员

注意 :系列的一部分: C#:从另一个类访问表单成员以及如何从C#中的另一个cs文件访问表单对象 。 你好, 想法是在TCP客户端接收/发送数据包时使用备忘录通知用户。 经过几次修复后,最合适的解决方案就是这个 public string TextValue { set { this.Memo.Text += value + “\n”; } } 这就是它被调用的方式 var form = Form.ActiveForm as Form1; if(form != null) form.TextValue = “Test asdasd”; 但是,由于不安全的线程调用,调用代码会引发exception。我在msdn找到了一个解决方案,但我似乎无法获得他们在那里使用的方法。 这是我的翻拍,不起作用。 private void SetTextMemo(string txt) { if(this.Memo.InvokeRequired) { this.Invoke(SetTextMemo,txt); //error here } else { this.Memo.Text += txt + “\n”; } […]

Winformsmultithreading:每次在UI线程上调用方法时都要创建一个新的委托吗?

我想调用一个操作UI线程控件的方法。 我的代码有效,我想优化。 我指的是MSDN上的这个资源 。 根据那里,我们应该这样做 public delegate void myDelegate(int anInteger, string aString); //… Label1.Invoke(new myDelegate(myMethod), new Object[] {1, “This is the string”}); 这会在每次调用时引入一个孤立的委托对象(内存泄漏)吗? 当我像下面那样使用委托的静态实例时,然后在每次调用时使用此实例来调用: private static _delegateInstance = new myDelegate(myMethod); //… Label1.Invoke(_delegateInstance , new Object[] {1, “This is the string”}); 这是线程安全吗? 我认为这会有更好的性能,因为委托实例只创建一次?

WPF Dispatcher.Invoke’hanging’

我有一个有点复杂的WPF应用程序,当尝试使用调度程序在UI线程上调用调用时,似乎是“挂起”或卡在Wait调用中。 一般过程是: 处理按钮上的单击事件 创建一个新线程(STA),其中:创建演示者和UI的新实例,然后调用Disconnect方法 断开然后在名为Name的UI上设置属性 然后,Name的setter使用以下代码来设置属性: if(this.Dispatcher.Thread != Thread.CurrentThread) { this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{ this.Name = value; // Call same setter, but on the UI thread }); return; } SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly. 我的问题是,当调用 dispatcher invoke方法时,它似乎每次都挂起,并且callstack指示它处于hibernate状态,等待或加入Invoke实现。 那么,有什么我做错了,我错过了,显而易见或没有,或者有更好的方法调用UI线程来设置这个属性(和其他)? 编辑:解决方案是在线程委托结束时调用System.Windows.Threading.Dispatcher.Run()(例如,正在执行工作的地方) – 感谢所有帮助过的人。

为什么我不能在另一个类中调用公共方法?

我有这两个类交互,我试图从第一类调用四个不同的类用于第二类。 这些方法是公共的,它们确实返回值,但由于某种原因,没有建立连接。 我尝试时得到的错误是: “An object reference is required for the nonstatic field, method, or property ‘GradeBook.[method I want called]'” 我已将所有内容初始化。 我不想将方法创建为静态。 我再次阅读了我的任务的细节,我甚至不应该这样,但我似乎无法让这个工作无论如何我说出来。 myGradeBook。[方法] GraceBook。[方法] 这似乎都会造成错误。 目前的错误: The best overloaded method match or ‘System.Console.WriteLine(string, object)’ has some invalid arguments. Arugment ‘2’: cannot convert from ‘method group’ to ‘object’ 我甚至不是那些意味着什么…… 编辑:我刚刚解决了这个问题,这要归功于Visual Studio的Step Intofunction。 我不知道为什么花了这么长时间才使用它。

pt 2,无法捕捉的例外

更新:我已经在Microsoft Connect上提交了错误报告: https : //connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details 如果您可以在您的计算机上重现此问题,请提供该错误以便修复它! 好的,我已经做了一些测试,我把问题简化为非常简单的事情: 一世。 在抛出exception的新类中创建方法: public class Class1 { public void CallMe() { string blah = null; blah.ToLower(); } } II。 创建一个MethodInfo,在其他地方指向此方法: Type class1 = typeof( Class1 ); Class1 obj = new Class1(); MethodInfo method = class1.GetMethod( “CallMe” ); III。 在try / catch块中包含对Invoke()的调用: try { method.Invoke( obj, null ); // exception […]

如何从另一个线程调用控制方法

我想从另一个线程调用RichTextBox.Find() 。 我怎样才能做到这一点? RichTextBox位于我在表单中使用的UserControl中。 我想从另一个线程更新它。 我能够使用Invoke更改其属性。 但无法弄清楚如何调用_ucResultRich.rchResult.Find(word, startIndex, RichTextBoxFinds.None); 从我的线程。 Thread thread=new Thread(thrHighlight); thread.Start(e.RowIndex); private void ThrHighlight(object obj) { string[] words = ucSearchControls.rdbExact.Checked ? new string[] { ucSearchControls.txtSearch.Text.Trim() } : ucSearchControls.txtSearch.Text.Split(‘ ‘); foreach (string word in words) { int startIndex = 0; while (startIndex < _ucResultRich.rchResult.TextLength) { int wordStartIndex = _ucResultRich.rchResult.Find(word, startIndex, RichTextBoxFinds.None); if (wordStartIndex […]

等待进程结束异步,然后调用主表单中的函数

我正在用C#编写一个游戏编辑器。 我的程序通过启动notepad.exe进程打开为.txt文件。 如果该进程退出,我想调用主窗体中的函数(更新文本框)。 这是我到目前为止所做的事情: void OpenTextEditor(TreeNode node) { Process editor = new Process(); editor.StartInfo.WorkingDirectory = “%WINDIR%”; editor.StartInfo.FileName = “notepad.exe”; var txtfilelocation = GetRealPathByNode(node); var txtfile = File.ReadAllText(txtfilelocation,Encoding.Default); txtfile = txtfile.Replace(“\n”, “\r\n”); File.WriteAllText(txtfilelocation,txtfile,Encoding.Default); editor.StartInfo.Arguments = txtfilelocation; editor.EnableRaisingEvents = true; editor.Exited += delegate { NotePadHasEnded(node); }; editor.Start(); //starten } public Delegate NotePadHasEnded(TreeNode node) { var txtfilelocation = […]