簡體   English   中英

如何從 blazor 中的同步方法調用異步並等待結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM