System.AggregateException
HResult=0x80131500
Message=One or more errors occurred.
Source=mscorlib
StackTrace:
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at WpfApp1.MainWindow.Connect() in MainWindow.xaml.cs:line 64
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Inner Exception 1:
RpcException: Status(StatusCode=Unknown, Detail="Exception was thrown by handler.")
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Grpc.Core.Internal.ClientResponseStream`2.<MoveNext>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at WpfApp1.LogClient.<ConnectAndListenForMessage>d__3.MoveNext()
namespace WpfApp1
{
public class LogClient
{
readonly Logger.Logger.LoggerClient client;
RichTextBox rtb;
public LogClient(Logger.Logger.LoggerClient client, RichTextBox rtb)
{
this.client = client;
this.rtb = rtb;
}
public async Task ConnectAndListenForMessage(Logger.LogMessage message)
{
var call = client.SendLogMessages();
await call.RequestStream.WriteAsync(message);
while (await call.ResponseStream.MoveNext()) //Error happens here
{
var newMessage = call.ResponseStream.Current;
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
rtb.AppendText(newMessage.Message);
rtb.AppendText(Environment.NewLine);
}), DispatcherPriority.Background);
}
}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Thread thread = new Thread(Connect);
thread.Start();
}
private void Connect()
{
try
{
Logger.LogMessage message = new Logger.LogMessage();
message.ClientType = 1;
message.Message = "connecting";
Channel channel = new Channel("192.168.1.223", 50051, ChannelCredentials.Insecure);
LogClient client = new LogClient(new Logger.Logger.LoggerClient(channel), rtb);
client.ConnectAndListenForMessage(message).Wait();
}
catch (Exception e)
{
Console.Write(e.StackTrace);
}
}
}
}class Program
{
static void Main(string[] args)
{
Server server = new Server
{
Services = { Logger.Logger.BindService(new LoggerImp()) },
Ports = { new ServerPort("192.168.1.223", 50051, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("Greeter server listening on port " + 50051);
Console.WriteLine("Press any key to stop the server...");
Console.ReadKey();
server.ShutdownAsync().Wait();
}
}
class LoggerImp : Logger.Logger.LoggerBase
{
private HashSet<IServerStreamWriter<LogMessage>> listeners = new HashSet<IServerStreamWriter<LogMessage>>();
public override Task ListenForMessages(LogListener request, IServerStreamWriter<LogMessage> responseStream, ServerCallContext context)
{
return base.ListenForMessages(request, responseStream, context);
}
public override async Task SendLogMessages(IAsyncStreamReader<LogMessage> requestStream, IServerStreamWriter<LogMessage> responseStream, ServerCallContext context)
{
listeners.Add(responseStream);
while (await requestStream.MoveNext())
{
var current = requestStream.Current;
if (current.ClientType == 1)
{
listeners.Add(responseStream);
}
foreach (IServerStreamWriter<LogMessage> listener in listeners)
{
try
{
await listener.WriteAsync(current);
}
catch (Exception)
{
//client stream no longer exists so remove it from list of active streams
listeners.Remove(listener);
}
}
}
}
}await listener.WriteAsync(current); while (await requestStream.MoveNext()) on your server side could also throw an exception if the client stream throws an exception. But since all Tasks seems to be awaited and since you get back in the while loop, this shouldn't be the problem. My best guess is that any of the listeners.Add or listeners.Remove calls throw an exception due to concurrent access (likely remove itterates through the entries and add/remove modifies the list).