Как разблокировать ConnectNamedPipe и ReadFile? [C #] - PullRequest
7 голосов
/ 30 августа 2009

У меня есть класс (NamedPipeManager), у которого есть поток (PipeThread), который ждет соединения NamedPipe с использованием (ConnectNamedPipe) и затем читает (ReadFile) - это блокирующие вызовы (не перекрывающиеся) - однако наступает момент, когда Я хочу разблокировать их - например, когда вызывающий класс пытается остановить NamedPipeManager ...

Как мне это прервать? Используя Thread.abort? Thread.interrupt? Есть ли правильный способ справиться с этим? Обратитесь к приведенному ниже коду, который иллюстрирует мою текущую ситуацию

main()
{
    NamedPipeManager np = new NamedPipeManager();
        ... do stuff ...
    ... do stuff ...
    np.Stop();      // at this point I want to stop waiting on a connection
}


class NamedPipeManager
{
private Thread PipeThread;

public NamedPipeManager
{
    PipeThread = new Thread(new ThreadStart(ManagePipes));
    PipeThread.IsBackground = true;
    PipeThread.Name = "NamedPipe Manager";
    PipeThread.Start();
}

private void ManagePipes()
{
    handle = CreateNamedPipe(..., PIPE_WAIT, ...);
    ConnectNamedPipe(handle, null);     // this is the BLOCKING call waiting for client connection

    ReadFile(....);             // this is the BLOCKING call to readfile after a connection has been established
    }


public void Stop()
{
    /// This is where I need to do my magic
    /// But somehow I need to stop PipeThread
    PipeThread.abort();     //?? my gut tells me this is bad
}
};

Итак, в функции Stop () - как бы изящно разблокировать вызов ConnectNamedPipe (...) или ReadFile (...)?

Любая помощь будет оценена. Спасибо,

Ответы [ 2 ]

6 голосов
/ 21 октября 2011

Кажется, он работает на VC6.0, WinXP, если я пытаюсь прервать ConnectNamedPipe DeleteFile("\\\\.\\pipe\\yourpipehere");

Так что просто укажите имя, а не дескриптор.

5 голосов
/ 30 августа 2009

Начиная с Windows Vista, для потоков доступна операция CancelSynchronousIO . Я не думаю, что для этого есть оболочка C #, поэтому вам нужно использовать PInvoke для ее вызова.

До Vista не было способа изящно выполнить такую ​​операцию. Я бы посоветовал не использовать отмену потоков (которая может работать, но не считается изящной). Лучше всего использовать перекрывающийся ввод-вывод.

...