我想从类中的进程线程事件触发中更改表单控件属性,我有以下代码,但我收到了这个异常:
调用线程无法访问此对象,因为不同的线程拥有它。
代码:
public partial class main : Window
{
public main()
{
InitializeComponent();
}
public void change()
{
label1.Content = "hello";
}
private void button1_Click(object sender, RoutedEventArgs e)
{
nmap nmap = new nmap(this);
nmap.test("hello");
}
}
class nmap
{
private main _frm;
private Process myprocess;
public nmap(main frm)
{
_frm = frm;
}
public void test(object obj)
{
string s1 = Convert.ToString(obj);
ProcessStartInfo startInfo = new ProcessStartInfo();
myprocess = new Process();
myprocess.StartInfo.FileName = "C:\\nmap\\nmap.exe";
myprocess.EnableRaisingEvents = true;
myprocess.Exited += new EventHandler(myProcess_Exited);
myprocess.Start();
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
try
{
_frm.change();
}
catch{}
}
}
请帮助我,我认为委托调用必须有效
我的项目是一个 WPF C# 项目。
答案是:
class nmap
{
private main _frm;
private Process myprocess;
public nmap()
{
}
public nmap(main frm)
{
_frm = frm;
}
public void test(object obj)
{
string s1 = Convert.ToString(obj);
ProcessStartInfo startInfo = new ProcessStartInfo();
myprocess = new Process();
myprocess.StartInfo.FileName = "C:\\nmap\\nmap.exe";
//myprocess.StartInfo.CreateNoWindow = true;
myprocess.EnableRaisingEvents = true;
//myprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myprocess.Exited += new EventHandler(myProcess_Exited);
myprocess.Start();
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
try
{
String s;
s = "hello";
_frm.Dispatcher.Invoke(_frm.USD, new Object[] { s });
}
catch{}
}
}
public partial class main : Window
{
public delegate void UpdateStatusDelegate(string value);
public UpdateStatusDelegate USD;
public main()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
USD = new UpdateStatusDelegate(this.AddString);
}
private void AddString(String s)
{
label1.Content = s;
}
public void change()
{
label1.Content = "hello";
}
private void button1_Click(object sender, RoutedEventArgs e)
{
nmap nmap = new nmap(this);
nmap.test("hello");
}
}