سؤال

وأنا أحاول لوضع الإخراج القياسي من 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 لتنفيذ هذه العملية بطريقة متزامنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top