C#:String作为事件的参数?
我有一个用于表单的GUI线程和另一个计算事物的线程。
表单有一个richtTextBox。 我希望worker-thread将字符串传递给表单,以便每个字符串都显示在文本框中。
每次在工作线程中生成一个新字符串时,我都会调用一个事件,现在应该显示该字符串。 但我不知道如何传递字符串! 这是我到目前为止所尝试的:
///// Form1 private void btn_myClass_Click(object sender, EventArgs e) { myClass myObj = new myClass(); myObj.NewListEntry += myObj_NewListEntry; Thread thrmyClass = new Thread(new ThreadStart(myObj.ThreadMethod)); thrmyClass.Start(); } private void myObj_NewListEntry(Object objSender, EventArgs e) { this.BeginInvoke((MethodInvoker)delegate { // Here I want to add my string from the worker-thread to the textbox! richTextBox1.Text += "TEXT"; // I want: richTextBox1.Text += myStringFromWorkerThread; }); }
///// myClass (working thread...) class myClass { public event EventHandler NewListEntry; public void ThreadMethod() { DoSomething(); } protected virtual void OnNewListEntry(EventArgs e) { EventHandler newListEntry = NewListEntry; if (newListEntry != null) { newListEntry(this, e); } } private void DoSomething() { ///// Do some things and generate strings, such as "test"... string test = "test"; // Here I want to pass the "test"-string! But how to do that?? OnNewListEntry(EventArgs.Empty); // I want: OnNewListEntry(test); } }
像这样
public class NewListEntryEventArgs : EventArgs { private readonly string test; public NewListEntryEventArgs(string test) { this.test = test; } public string Test { get { return this.test; } } }
然后你就像这样申报你的class级
class MyClass { public delegate void NewListEntryEventHandler( object sender, NewListEntryEventArgs args); public event NewListEntryEventHandler NewListEntry; protected virtual void OnNewListEntry(string test) { if (NewListEntry != null) { NewListEntry(this, new NewListEntryEventArgs(test)); } } }
并在订阅Form
private void btn_myClass_Click(object sender, EventArgs e) { MyClass myClass = new MyClass(); myClass.NewListEntry += NewListEntryEventHandler; ... } private void NewListEntryEventHandler( object sender, NewListEntryEventArgs e) { if (richTextBox1.InvokeRequired) { this.Invoke((MethodInvoker)delegate { this.NewListEntryEventHandler(sender, e); }); return; } richTextBox1.Text += e.Test; }
我冒昧地使NewListEntryEventArgs
类不可变,因为这是有道理的。 我还部分更正了您的命名约定,简化并更正了权宜之计。
您需要通过inheritanceEventArgs来创建新类。
创建自己的EventArgs
版本。
像这样做:
public class MyEventArgs : EventArgs { public string MyEventString {get; set; } public MyEventArgs(string myString) { this.MyEventString = myString; } }
然后在您的代码中将EventArgs
替换为MyEventArgs
并使用其中的字符串创建一个MyEventArgs
对象。
然后,您可以使用.MyEventString
实例.MyEventString
来访问它。
所以你会做这样的事情:
///// myClass (working thread...) class myClass { public event EventHandler NewListEntry; public void ThreadMethod() { DoSomething(); } protected virtual void OnNewListEntry(MyEventArgs e) { EventHandler newListEntry = NewListEntry; if (newListEntry != null) { newListEntry(this, e); } } private void DoSomething() { ///// Do some things and generate strings, such as "test"... string test = "test"; OnNewListEntry(new MyEventArgs(test)); } }
在你的forms:
private void myObj_NewListEntry(Object objSender, MyEventArgs e) { this.BeginInvoke((MethodInvoker)delegate { // Here I want to add my string from the worker-thread to the textbox! richTextBox1.Text += e.MyEventString; }); }
通常,您需要inheritanceEventArgs
并添加string
属性,然后使您的事件类型为EventHandler
,但这是BackgroundWorker
的经典案例。
此处示例: http : //msdn.microsoft.com/en-us/library/cc221403(v = vs95).aspx
在这里: C#backgroundWorker报告字符串?
上述就是C#学习教程:C#:String作为事件的参数?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1019888.html