2010-04-07 3 views
1

Je travaille avec un NamedPipeServerStream pour communiquer entre deux processus. Voici le code où j'initialise et connecte le tuyau:Pourquoi mon NamedPipeServerStream n'attend pas?

void Foo(IHasData objectProvider) 
{ 
    Stream stream = objectProvider.GetData(); 
    if (stream.Length > 0) 
    { 
     using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("VisualizerPipe", PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)) 
     { 
      string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
      string uiFileName = Path.Combine(currentDirectory, "VisualizerUIApplication.exe"); 
      Process.Start(uiFileName); 
      if(pipeServer.BeginWaitForConnection(PipeConnected, this).AsyncWaitHandle.WaitOne(5000)) 
      { 
       while (stream.CanRead) 
       { 
        pipeServer.WriteByte((byte)stream.ReadByte()); 
       } 
      } 
      else 
      { 
       throw new TimeoutException("Pipe connection to UI process timed out."); 
      } 
     } 
    } 
} 

private void PipeConnected(IAsyncResult e) 
{ 
} 

Mais cela ne semble jamais attendre. Je reçois constamment l'exception suivante:

System.InvalidOperationException: Pipe n'a pas encore été connecté. à System.IO.Pipes.PipeStream.CheckWriteOperations() à System.IO.Pipes.PipeStream.WriteByte (valeur octet) à PeachesObjectVisualizer.Visualizer.Show (IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)

Je pense qu'après l'attente, tout devrait être prêt à partir.

Si j'utilise pipeServer.WaitForConnection() tout fonctionne correctement, mais la suspension de l'application si le canal ne se connecte pas n'est pas une option.

Répondre

7

Vous devez appeler EndWaitForConnection.

var asyncResult = pipeServer.BeginWaitForConnection(PipeConnected, this); 

if (asyncResult.AsyncWaitHandle.WaitOne(5000)) 
{ 
    pipeServer.EndWaitForConnection(asyncResult); 

    // ... 
} 

Voir: IAsyncResult design pattern.

+0

J'ai essayé cette approche et maintenant il attend environ 10 secondes avant de se connecter, mais quand je n'utilise pas BeginWait, il se connecte instantanément. Selon MSDN AsyncWaitHandle.WaitOne (5000) bloque jusqu'à signalé mais ce n'est apparemment pas le cas. – Farnk

+0

Désolé, mon code de copie était erroné et le provoquait pendant un petit moment. J'ai corrigé le code et maintenant cela fonctionne. Merci! – Farnk

Questions connexes