Я хочу, чтобы изменить свойство элемента управления формы от пожара события процесса потока в классе, у меня есть следующий код, но я получил это исключение:Делегат вызова
вызывающий поток не может получить доступ к этому объекту, потому что другой Нить владеет им.
Код:
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{}
}
}
Пожалуйста, помогите мне в этом, я думаю, что делегат Invoke должен быть работа
Мой проект является # проект 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");
}
}
Hi Хади, я работаю в WPF нет InvokeRequired, но в любом случае у меня все еще есть проблемы с этим! PLS описать больше спасибо! –
где я должен использовать delegete invoke в классе nmap или в форме главного окна? –
Ах, вы не заметили, что упоминаете, что используете WPF. В WPF вы должны иметь возможность сделать то же самое (почти) с помощью метода Dispatcher.Invoke. –