请教个菜鸟问题 在类中更新窗体上的控件 可以做把form的对象传给类 不过想用委托实现 整半天正不明白了 最好能给个简单的小例子 多谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在form中写个public的方法,在类中调用这个方法更新界面。 class A { public event EventHandler viewProcess; private void RaiseviewProcess(object sender, EventArgs e) { if (viewProcess != null) { viewProcess(sender, e); } } private void aaaa() { RaiseviewProcess(this,new EventArgs()); } }class Form1{ public Form1() { .... A a1= new A(); a1.viewProcess += (o,e) = > { 更新控件代码 }; }} Thread thread1, thread2; Object obj = new object(); List<ManualResetEvent> mres = new List<ManualResetEvent>(); Task task = new Task(); private void button1_Click(object sender, EventArgs e) { richTextBox1.Text = ""; Test(); } public void Test() { task.OnMessageNotice += invokeMsg; ManualResetEvent mre1 = new ManualResetEvent(false); mres.Add(mre1); ManualResetEvent mre2 = new ManualResetEvent(false); mres.Add(mre2); thread1 = new Thread(new ParameterizedThreadStart(task.DoWork)); thread2 = new Thread(new ParameterizedThreadStart(task.DoWork)); DataCls data1 = new DataCls(1, mre1); DataCls data2 = new DataCls(2, mre2); thread1.Start(data1); thread2.Start(data2); WaitHandle.WaitAll(mres.ToArray()); lock (obj) { richTextBox1.AppendText("任务已完成"); } } public delegate void SetTextHanlder(string msg); private void invokeMsg(String obj){ if (richTextBox1.InvokeRequired) { richTextBox1.BeginInvoke(new SetTextHanlder(SetText), new object[] { obj }); } } private void SetText(string msg) { lock (obj) { richTextBox1.AppendText("\r\n" + msg); } //} } private void DoWork(object obj) { Invoke(new SetTextHanlder(SetText), new object[] { obj }); } } //消通知委托 public delegate void MessageNotice(string msg); //任务类 public class Task { public event MessageNotice OnMessageNotice; public void DoWork(object state) { DataCls data = state as DataCls; MessageNoticeHandler(string.Format("每{0}个任务正在执行......", data.count)); //执行任务 具体任务就不写了用sleep代表任务要用很长时间。 Thread.Sleep(3000); MessageNoticeHandler(string.Format("每{0}个任务执行完成", data.count)); data.m_mre.Set(); } protected void MessageNoticeHandler(string msg) { if (OnMessageNotice != null) { OnMessageNotice(msg); } } } public class DataCls { public ManualResetEvent m_mre; public int count; public DataCls(int i,ManualResetEvent mre) { count = i; m_mre = mre; } } class MyClass{ Action<string> UpdateLabel; public MyClass(Action<string> updatelabel) { UpdateLabel = updatelabel; } public void Func() { if (UpdateLabel != null) UpdateLabel("hello"); }}窗体调用:MyClass mc = new MyClass((x) => { label1.Text = x; });mc.Func(); 我对着写了一个 class1里的事件对象一直是null啊 C# 怎么样获取鼠标单击事件 C#怎么获取计算机的机器号 请教数据库的操作,对两个表的操作? 又一个字符串的问题,大家帮忙看一下 我为这个问题哭了好久,大家帮帮我 C#可以写些什么程序啊?? xslt和EXCEL的问题! 面试通过一家公司后的一个基于法律的问题,想请教大家!!(广州天河软件园) 为什么存在dataset中的日期在使用data adapter的update后会被截断? 不好解决的多线程问题??? c# 的应用程序怎么转成BS结构,用vs2010开发的 使用Windows右键菜单,怎么用?
class A
{
public event EventHandler viewProcess; private void RaiseviewProcess(object sender, EventArgs e)
{
if (viewProcess != null)
{
viewProcess(sender, e);
}
}
private void aaaa()
{
RaiseviewProcess(this,new EventArgs());
}
}
class Form1
{
public Form1()
{
....
A a1= new A();
a1.viewProcess += (o,e) = > { 更新控件代码 };
}
}
Object obj = new object();
List<ManualResetEvent> mres = new List<ManualResetEvent>();
Task task = new Task(); private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = "";
Test();
}
public void Test()
{
task.OnMessageNotice += invokeMsg;
ManualResetEvent mre1 = new ManualResetEvent(false);
mres.Add(mre1);
ManualResetEvent mre2 = new ManualResetEvent(false);
mres.Add(mre2);
thread1 = new Thread(new ParameterizedThreadStart(task.DoWork));
thread2 = new Thread(new ParameterizedThreadStart(task.DoWork)); DataCls data1 = new DataCls(1, mre1);
DataCls data2 = new DataCls(2, mre2);
thread1.Start(data1);
thread2.Start(data2);
WaitHandle.WaitAll(mres.ToArray());
lock (obj)
{
richTextBox1.AppendText("任务已完成");
} }
public delegate void SetTextHanlder(string msg);
private void invokeMsg(String obj){ if (richTextBox1.InvokeRequired)
{
richTextBox1.BeginInvoke(new SetTextHanlder(SetText), new object[] { obj });
}
}
private void SetText(string msg)
{
lock (obj)
{
richTextBox1.AppendText("\r\n" + msg);
}
//}
} private void DoWork(object obj)
{
Invoke(new SetTextHanlder(SetText), new object[] { obj });
}
} //消通知委托
public delegate void MessageNotice(string msg);
//任务类
public class Task
{
public event MessageNotice OnMessageNotice;
public void DoWork(object state)
{
DataCls data = state as DataCls;
MessageNoticeHandler(string.Format("每{0}个任务正在执行......", data.count));
//执行任务 具体任务就不写了用sleep代表任务要用很长时间。
Thread.Sleep(3000);
MessageNoticeHandler(string.Format("每{0}个任务执行完成", data.count)); data.m_mre.Set();
} protected void MessageNoticeHandler(string msg)
{
if (OnMessageNotice != null)
{
OnMessageNotice(msg);
}
} } public class DataCls
{
public ManualResetEvent m_mre;
public int count;
public DataCls(int i,ManualResetEvent mre)
{
count = i;
m_mre = mre;
}
}
{
Action<string> UpdateLabel;
public MyClass(Action<string> updatelabel)
{ UpdateLabel = updatelabel; }
public void Func()
{
if (UpdateLabel != null) UpdateLabel("hello");
}
}
窗体调用:
MyClass mc = new MyClass((x) => { label1.Text = x; });
mc.Func();