Skip to content

InvalidOperationException: There is already one outstanding 'SendAsync' call for this WebSocket instance #270

@djonasdev

Description

@djonasdev

This issue relates to #260

Actually the GraphQLRequest are processed parallel and not as you want in serial.

The Issue seems to be in https://github.com/graphql-dotnet/graphql-client/blob/master/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs#L81

_requestSubscription = _requestSubject.Select(SendWebSocketRequestAsync).Concat().Subscribe();

changing back to https://github.com/haprotec/graphql-client/blob/subscriptions-api/src/GraphQL.Client/Http/GraphQLHttpWebSocket.cs#L42 should fix this problem.

_requestSubscription = _requestSubject.Select(request => Observable.FromAsync(() => _sendWebSocketRequest(request))).Concat().Subscribe();

Old version

class Program
{
	static void Main(string[] args)
	{
		try
		{
			Console.WriteLine("started");
			var subject = new Subject<int>();
			var subscription = subject.Select(i => Observable.FromAsync(() => FooAsync(i))).Concat().Subscribe();

			for (int i = 0; i < 10; i++)
			{
				Console.WriteLine($"add item nr. {i}");
				subject.OnNext(i);
			}
			Console.WriteLine("all items added");
		}
		catch (Exception e)
		{
			Console.WriteLine(e);
		}
		Console.WriteLine("Press any key to exit.");
		Console.ReadKey();
	}

	public static async Task<int> FooAsync(int i)
	{
		await Task.Delay(TimeSpan.FromSeconds(1));
		Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: item {i} elapsed");
		return i;
	}
}
started
add item nr. 0
add item nr. 1
add item nr. 2
add item nr. 3
add item nr. 4
add item nr. 5
add item nr. 6
add item nr. 7
add item nr. 8
add item nr. 9
all items added
Press any key to exit.
08:49:19: item 0 elapsed
08:49:20: item 1 elapsed
08:49:21: item 2 elapsed
08:49:22: item 3 elapsed
08:49:23: item 4 elapsed
08:49:24: item 5 elapsed
08:49:25: item 6 elapsed
08:49:26: item 7 elapsed
08:49:27: item 8 elapsed
08:49:28: item 9 elapsed

New version

class Program
{
	static void Main(string[] args)
	{
		try
		{
			Console.WriteLine("started");
			var subject = new Subject<int>();
			var subscription = subject.Select(FooAsync).Concat().Subscribe();

			for (int i = 0; i < 10; i++)
			{
				Console.WriteLine($"add item nr. {i}");
				subject.OnNext(i);
			}
			Console.WriteLine("all items added");
		}
		catch (Exception e)
		{
			Console.WriteLine(e);
		}
		Console.WriteLine("Press any key to exit.");
		Console.ReadKey();
	}

	public static async Task<int> FooAsync(int i)
	{
		await Task.Delay(TimeSpan.FromSeconds(1));
		Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: item {i} elapsed");
		return i;
	}
}
started
add item nr. 0
add item nr. 1
add item nr. 2
add item nr. 3
add item nr. 4
add item nr. 5
add item nr. 6
add item nr. 7
add item nr. 8
add item nr. 9
all items added
Press any key to exit.
08:50:08: item 0 elapsed
08:50:08: item 1 elapsed
08:50:08: item 2 elapsed
08:50:08: item 3 elapsed
08:50:08: item 5 elapsed
08:50:08: item 6 elapsed
08:50:08: item 7 elapsed
08:50:08: item 4 elapsed
08:50:08: item 9 elapsed
08:50:08: item 8 elapsed

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions