ilostmyid2 Ответов: 0

Как прервать асинхронное ожидание соединения с трубой?


В следующем коде
namespace ns
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string ProcessCommand(string cmd)
        {
            return "i got " + cmd;
        }

        StreamReader d_sr;
        StreamWriter d_sw;
        NamedPipeServerStream d_pipe;
        IAsyncResult d_ar;

        void Connected(IAsyncResult ar)
        {
            d_pipe.EndWaitForConnection(ar);
            d_sw.AutoFlush = true;
            while (true)
            {
                var cmd = d_sr.ReadLine();
                if (cmd == null)
                    break;
                var answer = ProcessCommand(cmd);
                d_sw.WriteLine(answer);
            }
            d_pipe.Disconnect();
            d_ar = d_pipe.BeginWaitForConnection(Connected, null);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            d_pipe = new NamedPipeServerStream("vatm", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
            d_sr = new StreamReader(d_pipe);
            d_sw = new StreamWriter(d_pipe);
            d_ar = d_pipe.BeginWaitForConnection(Connected, null);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            d_pipe.EndWaitForConnection(d_ar);
            d_pipe.Dispose();
        }
    }
}

когда я иду, чтобы закрыть форму, она ждет в EndWaitForConnection. Я скажу трубе, чтобы она больше не ждала клиента, и сделаю аборт. Я попробовал d_pipe.Close () вместо вызова EndWaitForConnection, но я получаю это исключение при вызове EndWaitForConnection в Connected.
An unhandled exception of type 'System.ObjectDisposedException' occurred in System.Core.dll Additional information: Cannot access a closed pipe.

Есть идеи?

Что я уже пробовал:

уже описанный в вопросе

0 Ответов