C# 如何以同步方式运行异步调用

C# 如何以同步方式运行异步调用,c#,macos,cocoa,xamarin,wkwebview,C#,Macos,Cocoa,Xamarin,Wkwebview,我是C#&Xamarin的新手。我觉得会有一些快速的解决办法来实现这一点,但我已经花了一天的时间来找到一个。请给我一个提示,这样我才能朝正确的方向前进 方法是在获取高度和宽度后调整窗口大小。问题是GetWidth()和GetHeight()在异步模式下运行,而主线程设置Window.SetFrame(…),因此我无法调整窗口大小 我认为一种解决方案是级联并在最里面的块中设置窗口框架 private void ResizeWindow() { _webView.EvaluateJavaS

我是C#&Xamarin的新手。我觉得会有一些快速的解决办法来实现这一点,但我已经花了一天的时间来找到一个。请给我一个提示,这样我才能朝正确的方向前进

方法是在获取高度和宽度后调整窗口大小。问题是
GetWidth()
GetHeight()
在异步模式下运行,而主线程设置
Window.SetFrame(…)
,因此我无法调整窗口大小

我认为一种解决方案是级联并在最里面的块中设置窗口框架

private void ResizeWindow() 
{
    _webView.EvaluateJavaScript("document.readyState",
                                    (complete, error) =>
        {
            if (complete != null)
            {
                GetHeight();
                GetWidth();

                CGRect windowRect = Window.Frame;
                windowRect.Size = new CGSize(_width, _height);
                Window.SetFrame(windowRect,true);
        }
    });
}

    private void GetWidth()
    {

        _webView.EvaluateJavaScript("document.body.scrollWidth",
                                    (scrollWidth, wError) =>
        {
            if (scrollWidth != null && nfloat.TryParse(scrollWidth.ToString(), out nfloat value))
            {
                _width = value;
            }
        });

    }

    private void GetHeight()
    {
        _webView.EvaluateJavaScript("document.body.scrollHeight",
                                   (scrollHeight, hError) =>
        {
            if (scrollHeight != null && nfloat.TryParse(scrollHeight.ToString(), out nfloat value))
            {
                _height = value;
            }

        });
    }

Xamarin.iOS
已经为
WKWebView.EvaluateJavaScript
提供了基于
TaskCompletionSource
的包装

因此,您可以等待
调用
EvaluateJavaScriptAsync
以获得基于
NSValue
的结果,然后将其转换为C值类型

因为我知道正在运行的javascript返回一个数字,所以我可以将
NSObject
返回(实际上是一个
NSValue
)转换为
NSNumber
,并从中获得一个C#
long

例子:
我不确定上面的方法是否适用于iOS,但它不适用于OSX。我最后调用了一个嵌套调用。@AnoopVaidya奇怪的是,我在应用商店里有这个代码。。。。您可以查看源代码,它只是一个TaskCompletionSource包装器。
var result = await webview.EvaluateJavaScriptAsync("document.body.scrollWidth");
var width = (result as NSNumber).Int64Value;
result = await webview.EvaluateJavaScriptAsync("document.body.scrollHeight");
var height = (result as NSNumber).Int64Value;