public class Sing : IStreamRequest<Song> { public string Message { get; set; } } public class Song { public string Message { get; set; } } public class SingHandler : IStreamRequestHandler<Sing, Song> { private readonly TextWriter _writer; public SingHandler(TextWriter writer) { _writer = writer; } public async IAsyncEnumerable<Song> Handle(Sing request, [EnumeratorCancellation]CancellationToken cancellationToken) { await _writer.WriteLineAsync($"--- Handled Sing: {request.Message}, Song"); yield return await Task.Run(() => new Song { Message = request.Message + "ing do" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing re" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing mi" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing fa" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing so" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing la" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing ti" }); yield return await Task.Run(() => new Song { Message = request.Message + "ing do" }); } }然后我们就用通过异步 foreach 来进行调用了:
await foreach (Song s in mediator.CreateStream(new Sing { Message = "Sing" })) { // 根据流式响应的结果进行业务处理 }也就是说这种StreamRequest我们需要通过IMediator的CreateStream方法来调用处理程序。
3.Blazor
public class GenericPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> { ``