Получите рабочий процесс, данный дескриптор процесса

Я обычно использую Пул потоков каждый раз, когда я должен просто сделать что-то на другом потоке и действительно не забочусь, когда он работает или заканчивается. Что-то как вход или возможно даже фон, загружающий файл (хотя существуют лучшие способы сделать тот асинхронный стиль). Я использую свой собственный поток, когда мне нужно больше управления. Также то, что я нашел, использует Ориентированную на многопотоковое исполнение очередь (взломайте свое собственное) сохранить "объекты команды" хорошо, когда у меня есть несколько команд, что я должен продолжить работать в> 1 поток. Таким образом, Вы были бы, может разделить XML-файл и поместить каждый элемент в очередь и затем иметь несколько потоков, работающих над выполнением некоторой обработки на этих элементах. Я записал такую очередь обратно путь в uni (VB.net!), что я преобразовал в C#. Я включал его ниже ни по какой конкретной причине (этот код мог бы содержать некоторые ошибки).

using System.Collections.Generic;
using System.Threading;

namespace ThreadSafeQueue {
    public class ThreadSafeQueue<T> {
        private Queue<T> _queue;

        public ThreadSafeQueue() {
            _queue = new Queue<T>();
        }

        public void EnqueueSafe(T item) {
            lock ( this ) {
                _queue.Enqueue(item);
                if ( _queue.Count >= 1 )
                    Monitor.Pulse(this);
            }
        }

        public T DequeueSafe() {
            lock ( this ) {
                while ( _queue.Count <= 0 )
                    Monitor.Wait(this);

                return this.DeEnqueueUnblock();

            }
        }

        private T DeEnqueueUnblock() {
            return _queue.Dequeue();
        }
    }
}
9
задан tshepang 17 February 2014 в 21:36
поделиться

4 ответа

В простом C # похоже, что вам нужно перебрать их все:

// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle);

Приведенный выше пример намеренно завершается неудачно, если дескриптор не ' т найдено. В противном случае вы, конечно, можете использовать SingleOrDefault . По-видимому, ему не нравится, что вы запрашиваете дескриптор ID процесса 0 , отсюда и дополнительное условие.

Используя WINAPI, вы можете использовать GetProcessId . Мне не удалось найти его на pinvoke.net, но это должно сработать:

[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);

(в подписи используется DWORD , но идентификаторы процессов представлены int в .NET BCL )

Кажется немного странным, что у вас есть дескриптор, но не идентификатор процесса. Дескрипторы процесса получаются путем вызова OpenProcess , который принимает идентификатор процесса.

9
ответ дан 4 December 2019 в 15:22
поделиться
using System.Diagnostics;

class ProcessHandler {
    public static Process FindProcess( IntPtr yourHandle ) {
        foreach (Process p in Process.GetProcesses()) {
            if (p.Handle == yourHandle) {
                return p;
            }
        }

        return null;
    }
}
3
ответ дан 4 December 2019 в 15:22
поделиться

Кажется, нет простого способа сделать это с помощью .Net API. Вопрос в том, откуда у вас эта ручка? Если таким же образом вы можете получить доступ к идентификатору процессов, вы можете использовать:

Process.GetProcessById (int iD)

1
ответ дан 4 December 2019 в 15:22
поделиться

Вы можете использовать вызов WinAPI GetWindowThreadProcessId

http: //www.pinvoke .net / default.aspx / user32 / GetWindowThreadProcessId.html

Чтобы получить идентификатор процесса - затем получить объект процесса, используя его .....

Но почему бы вам не перечислить идентификаторы запущенных процессы?

0
ответ дан 4 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: