C#
- 22 ответа
- 0 вопросов
15
Вклад в тег
<ControlTemplate x:Key="TestButtonTemplate" TargetType="Button">
<Border Background="{TemplateBinding Background}"
BorderThickness="0"
CornerRadius="5"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}">
<ContentControl Foreground="{TemplateBinding Foreground}"
Content="{TemplateBinding Content}"
VerticalAlignment="Center"
HorizontalAlignment="Center"
FontSize="{TemplateBinding FontSize}"
FontFamily="{TemplateBinding FontFamily}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
.GetAwaiter().GetResult()
если вам нужно получить результат синхронно..ConfigureAwait(false)
в своём асинхронном вызове, это значит, что CLR будет ждать освобождения вызывающего потока, чтобы продолжить выполнять код после await. Однако вызывающий поток уже бесконечно занят ожиданием завершения вашего асинхронного метода там, где вы получаете Result - вот вам и типичный deadlock..ConfigureAwait(false)
к вашему асинхронному вызову (это приведет к необходимости выполнять дальнейшие изменения в UI через диспетчер, Dispatcher.Invoke
в WPF), либо запустить свой код в контексте синхронизации, отличном от того, который используется в UI - самый простой способ это вообще не использовать контекст - выполнить свой код внутри Task.Run:Task.Run(async() => html = await browser.GetSourceAsync());
private async Task<string> GetHTMLFromWebBrowser()
{
return await browser.GetSourceAsync();
}
....
Task.Run(async() => html = await GetHTMLFromWebBrowser());