تحديث واجهة المستخدم من عملية مختلفة فشل
-
03-07-2019 - |
سؤال
وأنا أحاول لوضع الإخراج القياسي من NMAP في تطبيق النافذة WPF (النص بالضبط). أنا أحاول أن استخدام Dispatcher.Invoke ولكن عندما تبدأ عملية NMAP كل شيء تجمد فقط. عندما حاولت ذلك في تطبيق وحدة تحكم (ث / س استدعاء)، عملت كل شيء على ما يرام، وأعتقد انها مشكلة مع أسلوب استدعاء. NMAP نفسه يعمل، والانتهاء من العمل، ولكن لم يكن هناك استجابة في نافذتي.
وهنا هو رمز أنا باستخدام:
Process nmap = new Process();
nmap.StartInfo.FileName = Properties.Settings.Default.NmapResidentialPath;
nmap.StartInfo.Arguments = arguments.ToString();
nmap.StartInfo.UseShellExecute = false;
nmap.StartInfo.RedirectStandardOutput = true;
nmap.OutputDataReceived += new DataReceivedEventHandler(nmap_OutputDataReceived);
nmap.Start();
nmap.BeginOutputReadLine();
nmap.WaitForExit();
nmap.Close();
وأسلوب معالج الحدث:
void nmap_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => nmapOutput.Text += "\n" + e.Data));
}
}
المحلول
وربما يكون ذلك بسبب أسباب مختلفة. أولا، تأكد من أن يتم إنشاء السيطرة nmapOutput على UI الموضوع. ثانيا، قد يسبب Dispatcher.Invoke UI الجمود الموضوع (وربما هو في حالتك).
وندعو دائما Dispatcher.CheckAccess () قبل استدعاء استدعاء، أو استخدام BeginInvoke لتنفيذ هذه العملية بطريقة متزامنة.
لا تنتمي إلى StackOverflow