我是C#的新手,无法搞清楚如何将事件从线程传递到GUI窗体线程。任何帮助,将不胜感激。我发现的所有例子都太复杂了。我只想从处理GUI的一个事件开始,然后让GUI做一些事情(现在,任何事情)。如何将单个事件从线程传递到GUI窗体线程?
namespace testEvents
{
public delegate void StuffHappenedDel(MessageEventArgs e);
public partial class Form1 : Form
{
workerThread thread;
int j = 0;
public Form1()
{
InitializeComponent();
thread = new workerThread();
thread.Start();
}
private void button1_Click(object sender, EventArgs e)
{
thread.Stop();
}
private void StuffHappenedDel(Object seder, EventArgs e)
{
j++;
}
}
public class workerThread
{
Thread worker;
private bool _quit = false;
/* I don't think this next line is correct*/
public event StuffHappenedDel StuffHappened;
protected virtual void OnStuffHappened(MessageEventArgs e)
{
if (StuffHappened != null)
StuffHappened(e);
}
public void Start()
{
ThreadStart start = new ThreadStart(Run);
worker = new Thread(start);
worker.Start();
}
private void Run()
{
int i = 0;
while (!_quit)
{
Thread.Sleep(1000);
i++;
OnStuffHappened(new MessageEventArgs(false, "it worked!"));
Console.WriteLine(string.Format("Slept {0} seconds.",i));
}
Console.WriteLine("Thread exiting");
}
}
public class MessageEventArgs : EventArgs
{
public MessageEventArgs(bool Error, string message)
{
IsError = Error;
Message = message;
}
public bool IsError { get; set; }
public string Message { get; set; }
}
}
谢谢你的快速反应。以后我会考虑BackgrounWorkers。目前,我想将一个来自通用线程的事件传递回GUI窗体。尽管你的代码块stil并没有向我解释。我对csharp非常陌生。我假设你的代码会在GUI代码中上升,但是如何在线程中触发事件? – Bob
我已更新帖子,希望有所帮助。你缺少的关键是附加的事件处理程序。主要要注意的是,即使UI线程设置了事件处理程序,工作实际上是在后台线程上完成的。 – keyboardP
@keyboardP先生你可以请看看我的问题:[http:// stackoverflow。COM /问题/ 14198145/Windows的手机-7-如何对通知-数据被更新的功能于列表框(http://stackoverflow.com/questions/14198145/windows-phone-7-how-to -notify-数据被更新的功能于列表框) –