[英]How to call async from sync method in blazor and wait for result?
在 Blazor webassembly 我在 js 文件中有 javascript function:
function AksMessage(message) {
return confirm(message);
}
在 razor 文件中:
[Inject]
public IJSRuntime JSRuntime { get; set; }
public async Task<bool> askMessage(msg)
{
await JSRuntime.InvokeVoidAsync("AskMessage", msg);
}
現在在一些非異步 function 中,如果用戶單擊並返回 false 或 true,我想調用 askMessage 並獲取結果。 如何運行它並等待代碼同步部分的結果? 如果我做:
var askmsg = Task.Run(async () => await askMessage("question"));
和 askmsg.Result 我有異常,監視器不能等待這個運行時。
我剛剛解決了在 gRPC 攔截器上設置不記名令牌的問題,這需要 WASM 中的一些異步代碼,你可以這樣做:
public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
TRequest request,
ClientInterceptorContext<TRequest, TResponse> context,
AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
{
var call = continuation(request, context);
return new AsyncUnaryCall<TResponse>(
call.ResponseAsync,
GetMetadata(),
call.GetStatus,
call.GetTrailers,
call.Dispose);
}
private async Task<Metadata> GetMetadata()
{
try
{
if (!string.IsNullOrEmpty(await _authenticationManager.TryRefreshToken()))
_snackbar.Add("Refreshed Token.", Severity.Success);
var token = _authenticationManager.Token;
var metadata = new Metadata();
if (!string.IsNullOrEmpty(token))
{
metadata.Add("Authorization", $"Bearer {token}");
var userIdentity = (await _authenticationStateProvider.GetAuthenticationStateAsync()).User.Identity;
if (userIdentity!.IsAuthenticated)
metadata.Add("User", userIdentity.Name!);
}
else
{
_authenticationManager.Logout().GetAwaiter().GetResult();
_navigationManager.NavigateTo("/");
}
return metadata;
}
catch (Exception ex)
{
throw new InvalidOperationException("Failed to add token to request metadata", ex);
}
}
您可以從同步方法調用異步方法並像這樣等待它:
var askmsg = Task.Run(async () => await askMessage("question"));
var result = Task.WaitAndUnwrapException();
另一種解決方案是這樣的(同步方法返回其上下文):
var result = AsyncContext.RunTask(askMessage("question")).Result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.