Nehmen wir an, ich habe einen Singleton -Dispatcher mit einer Immobilie OnSubmit, die von mehreren Komponenten konsumiert werden sollte. Die Komponenten bieten asynchronisierte Handler für das OnSubmit -Ereignis. Das Ziel ist es, auf die Fertigstellung aller Handler zu warten.
public class Dispatcher
{
private readonly Subject _submitSubject = new();
public IObservable OnSubmit { get; }
private Dispatcher()
{
OnSubmit = _submitSubject.AsObservable().Publish().RefCount();
}
public static Dispatcher Instance { get; } = new();
public async Task SubmitAsync(int id)
{
_submitSubject.OnNext(id);
// await ???
// Here is the place where I would like to await the completion of all the subscribers
// Unfortunately I get here before the async handlers are completed since Rx.net isn't async by default
// https://github.com/dotnet/reactive#asyncrxnet
}
}
// Blazor componentA and other similar components
@code {
[Inject] private Dispatcher Dispatcher { get; set; } = Dispatcher.Instance;
protected override void OnInitialized()
{
Dispatcher.OnSubmit
.Select(id => Observable.FromAsync(() => HandleSubmitAsync(id)))
.Subscribe();
}
private async Task HandleSubmitAsync(int id)
{
await Task.Delay(new Random().Next(1000, 3000)); // Here will be real async operation
}
}
< /code>
Hier ist das Problem, wie ich das [url=viewtopic.php?t=11587]Problem[/url] gelöst habe, aber ich bin mir nicht sicher, ob es der beste Ansatz ist, um damit umzugehen. < /p>
public sealed class ObservableEvent(T args)
{
private readonly ConcurrentQueue _handlers = new();
public T Args { get; private set; } = args;
public void RegisterHandler(Task handler)
{
ArgumentNullException.ThrowIfNull(handler);
_handlers.Enqueue(handler);
}
public async Task WhenAll() => await Task.WhenAll(_handlers);
}
public class Dispatcher
{
private readonly Subject _submitSubject = new();
public IObservable OnSubmit { get; }
private Dispatcher()
{
OnSubmit = _submitSubject.AsObservable().Publish().RefCount();
}
public static Dispatcher Instance { get; } = new();
public async Task SubmitAsync(int id)
{
ObservableEvent observableEvent = new(new TabActionContext(tab, Id));
_submitSubject.OnNext(observableEvent);
await observableEvent.WhenAll();
}
}
// Blazor componentA and other similar components
@code {
[Inject] private Dispatcher Dispatcher { get; set; } = Dispatcher.Instance;
protected override void OnInitialized()
{
Dispatcher.OnSubmit
.Subscribe(@event => @event.RegisterHandler(HandleSubmitAsync(@event.Args)));
}
private async Task HandleSubmitAsync(TabActionContext context)
{
await Task.Delay(new Random().Next(1000, 3000)); // Here will be real async operation
}
}
Nehmen wir an, ich habe einen Singleton -Dispatcher mit einer Immobilie OnSubmit, die von mehreren Komponenten konsumiert werden sollte. Die Komponenten bieten asynchronisierte Handler für das OnSubmit -Ereignis. Das Ziel ist es, auf die Fertigstellung aller Handler zu warten.[code]public class Dispatcher { private readonly Subject _submitSubject = new();
public static Dispatcher Instance { get; } = new();
public async Task SubmitAsync(int id) { _submitSubject.OnNext(id); // await ???
// Here is the place where I would like to await the completion of all the subscribers // Unfortunately I get here before the async handlers are completed since Rx.net isn't async by default // https://github.com/dotnet/reactive#asyncrxnet } }
// Blazor componentA and other similar components @code { [Inject] private Dispatcher Dispatcher { get; set; } = Dispatcher.Instance;
private async Task HandleSubmitAsync(int id) { await Task.Delay(new Random().Next(1000, 3000)); // Here will be real async operation }
} < /code> Hier ist das Problem, wie ich das [url=viewtopic.php?t=11587]Problem[/url] gelöst habe, aber ich bin mir nicht sicher, ob es der beste Ansatz ist, um damit umzugehen. < /p> public sealed class ObservableEvent(T args) { private readonly ConcurrentQueue _handlers = new();
public T Args { get; private set; } = args;
public void RegisterHandler(Task handler) { ArgumentNullException.ThrowIfNull(handler); _handlers.Enqueue(handler); }
public async Task WhenAll() => await Task.WhenAll(_handlers); }
public class Dispatcher { private readonly Subject _submitSubject = new();
private async Task HandleSubmitAsync(TabActionContext context) { await Task.Delay(new Random().Next(1000, 3000)); // Here will be real async operation } } [/code]
Ich mache also ein Tutorial, das einen Teil über asynchrones JavaScript enthält. Ich habe das Gefühl, dass ich es ziemlich gut verstanden habe, aber es enthält diesen Abschnitt, der meiner Meinung...
Ich muss Farben aus der Farbklasse anzeigen, die dreimal angezeigt wird, und ich muss Instanzen von 3 verschiedenen Farben mit Threads hinzufügen. Das Problem ist, dass ich nicht weiß, wie ich...
Ich verwende das Kinect SDK in einer WPF-Anwendung und warte auf das Ereignis DepthFrameReady, um einige Vorgänge auszuführen. Um eine Blockierung der Benutzeroberfläche zu vermeiden, habe ich das...
Zuerst bin ich am Anfang des Lernens C#. Seien Sie also bitte sanft :)
Ich habe eine kleine Windows -Formulations -App, die am Ende einen SteamApp ist. Ich möchte, dass meine App wartet, bis das...
Ich habe eine Windows Forms -App, die am Ende eine SteamApp startet. Ich möchte, dass meine App wartet, bis das Spiel gefunden wird und wenn es geschlossen ist, um ein paar weitere Sachen zu machen....