Я обычно использую Пул потоков каждый раз, когда я должен просто сделать что-то на другом потоке и действительно не забочусь, когда он работает или заканчивается. Что-то как вход или возможно даже фон, загружающий файл (хотя существуют лучшие способы сделать тот асинхронный стиль). Я использую свой собственный поток, когда мне нужно больше управления. Также то, что я нашел, использует Ориентированную на многопотоковое исполнение очередь (взломайте свое собственное) сохранить "объекты команды" хорошо, когда у меня есть несколько команд, что я должен продолжить работать в> 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();
}
}
}
В простом 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
, который принимает идентификатор процесса.
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;
}
}
Кажется, нет простого способа сделать это с помощью .Net API. Вопрос в том, откуда у вас эта ручка? Если таким же образом вы можете получить доступ к идентификатору процессов, вы можете использовать:
Process.GetProcessById (int iD)
Вы можете использовать вызов WinAPI GetWindowThreadProcessId
http: //www.pinvoke .net / default.aspx / user32 / GetWindowThreadProcessId.html
Чтобы получить идентификатор процесса - затем получить объект процесса, используя его .....
Но почему бы вам не перечислить идентификаторы запущенных процессы?