Как я могу сканировать, если процесс открыт в другой теме? - PullRequest
0 голосов
/ 11 июля 2019

В основном у меня есть приложение WPF, где пользователь пишет имя процесса, затем запускается новый поток, где он продолжает сканирование, если процесс еще открыт или нет, поток будет живым, пока процесс не найден. Так что я могуВозьми ручку и напиши The Memory!

 private void scanBtn_Click (object sender, RoutedEventArgs e)
    {
        Thread s = new Thread(( ) => {

            this.Dispatcher.Invoke((Action)(( ) =>
            { 
                scanner(pName.Text);
            }));

        });


        try
        {

            if (pName.Text != string.Empty)
            {
                InfoTxt.Text = "[ WAITING FOR PROCESS TO OPEN ]";


                s.Start();
                pName.IsEnabled = false;
                if (!s.IsAlive)
                {
                    pName.IsEnabled = true;
                    InfoTxt.Text = "[ FOUND ]";
                    Process p = Process.GetProcessesByName(pName.Text)[0];


                }                                     
            }
         }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

  private static void scanner ( string procName)
    {
        while (true)
        {
            Process s = SeekProcName(procName);
            if (s != null) break;

        }
    }

    private static Process SeekProcName(string pName)
    {
        Process[] procs = Process.GetProcesses().Where(p => p.MainWindowHandle != (IntPtr)0).ToArray();
        Process f = null;

        foreach (var item in procs)
        {
            if (item.ProcessName.ToLower() == pName.ToLower())
            {
                f = item;
                break;
            }
        }
        return f;
    }

1 Ответ

0 голосов
/ 11 июля 2019

Поток s пытается запустить делегат в потоке пользовательского интерфейса, что означает, что он ничем не отличается от прямого вызова SeekProcName(procName) в обработчике событий.

Было бы лучше использовать Task.Runи async/await для запуска проверки в фоновом потоке.Когда await возвращается, выполнение возобновляется в потоке пользовательского интерфейса, что означает, что пользовательский интерфейс может быть обновлен без необходимости Invoke или BeginInvoke

private async void scanBtn_Click (object sender, RoutedEventArgs e)
{
    InfoTxt.Text = "[ WAITING FOR PROCESS TO OPEN ]";
    //Read the textbox contets *before* starting the task
    var name=pName.Text;

    var p=await Task.Run(()=>SeekProcName(name));
    if (p!=null)
    {
        InfoTxt.Text = "[ FOUND ]";
    }
}

Это может быть вызвано в цикле с небольшой задержкой междуитерации, без блокировки потока пользовательского интерфейса:

private async void scanBtn_Click (object sender, RoutedEventArgs e)
{
    while(someCondition)
    {
        InfoTxt.Text = "[ WAITING FOR PROCESS TO OPEN ]";
        var name=pName.Text;
        var p=await Task.Run(()=>SeekProcName(name));
        if (p!=null)
        {
            InfoTxt.Text = "[ FOUND ]";
        }
        await Task.Delay(1000);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...