小编pro*_*man的帖子

Task.Wait在OperationCanceledException的情况下出现意外行为

考虑以下代码:

CancellationTokenSource cts0 = new CancellationTokenSource(), cts1 = new CancellationTokenSource();
try
{
    var task = Task.Run(() => { throw new OperationCanceledException("123", cts0.Token); }, cts1.Token);
    task.Wait();
}
catch (AggregateException ae) { Console.WriteLine(ae.InnerException); }
Run Code Online (Sandbox Code Playgroud)

由于MSDN任务应该是在Faulted状态,因为它的令牌不匹配异常的令牌(也IsCancellationRequested就是false):

如果令牌的IsCancellationRequested属性返回false,或者异常的令牌与Task的令牌不匹配,则OperationCanceledException被视为正常异常,导致Task转换到Faulted状态.

当我使用.NET 4.5.2在控制台应用程序中启动此代码时,我得到Canceled状态任务(聚合异常包含未知TaskCanceledExeption,而不是原始).并且原始异常的所有信息都将丢失(消息,内部异常,自定义数据).

我也注意到的这种行为Task.Wait不同于await task在以下情况下OperationCanceledException.

try { Task.Run(() => { throw new InvalidOperationException("123"); }).Wait(); } // 1
catch (AggregateException ae) { Console.WriteLine(ae.InnerException); }

try { await Task.Run(() => { …
Run Code Online (Sandbox Code Playgroud)

.net c# wait task-parallel-library cancellation

10
推荐指数
2
解决办法
2358
查看次数

Windows Phone 8.1 XAML应用程序.如何防止不适当的自动对焦变化?

想象一下以下简单的页面标记:

<Page
    x:Class="AutoFocusBug.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <StackPanel>
        <!--<Button x:Name="FocusHolder" Width="0" Height="0" MinHeight="0" MinWidth="0"/>-->
        <TextBox Text="zxczczczczx"/>
        <Button x:Name="Button1" Content="Button1" Click="ButtonBase_OnClick"/>
    </StackPanel>
</Page>
Run Code Online (Sandbox Code Playgroud)

和以下代码隐藏:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    Button1.Visibility = Visibility.Collapsed;
}
Run Code Online (Sandbox Code Playgroud)

当我点击Button1按钮时它会隐藏(这是预期的和期望的)但由于某种原因TextBox自动获得焦点并出现在屏幕上的键盘.我不希望这种意外的自动对焦.

我可以尝试在Click处理程序中使用焦点做一些事情,但在实际应用程序中,它是使用带有命令等的ViewModel实现的,它看起来像脏黑客(即使我在隐藏按钮后立即更改焦点,键盘也会短时间出现).

我找到的第二种方法是在文本框(注释FocusHolder)之前的某处创建"隐形"按钮,这样做要好得多,但看起来也不正确.

那是什么?这是一种我能以某种方式配置为从重叠元素"重定向"焦点的机制吗?或者这是一个错误?什么是防止这种不良自动对焦的正确方法?

c# xaml focus windows-phone-8.1

6
推荐指数
1
解决办法
1609
查看次数