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