小编Seb*_*zus的帖子

同步等待异步操作,以及为什么Wait()在这里冻结程序

前言:我正在寻找解释,而不仅仅是解决方案.我已经知道了解决方案.

尽管花了几天时间研究MSDN关于基于任务的异步模式(TAP),异步和等待的文章,但我仍然对一些更精细的细节感到困惑.

我正在为Windows Store应用程序编写一个记录器,我想支持异步和同步日志记录.异步方法遵循TAP,同步方法应该隐藏所有这些,并且看起来像普通方法一样工作.

这是异步日志记录的核心方法:

private async Task WriteToLogAsync(string text)
{
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile file = await folder.CreateFileAsync("log.log",
        CreationCollisionOption.OpenIfExists);
    await FileIO.AppendTextAsync(file, text,
        Windows.Storage.Streams.UnicodeEncoding.Utf8);
}
Run Code Online (Sandbox Code Playgroud)

现在相应的同步方法......

版本1:

private void WriteToLog(string text)
{
    Task task = WriteToLogAsync(text);
    task.Wait();
}
Run Code Online (Sandbox Code Playgroud)

这看起来是正确的,但它不起作用.整个程序永远冻结.

版本2:

嗯..也许任务没有开始?

private void WriteToLog(string text)
{
    Task task = WriteToLogAsync(text);
    task.Start();
    task.Wait();
}
Run Code Online (Sandbox Code Playgroud)

这引发了 InvalidOperationException: Start may not be called on a promise-style task.

版本3:

嗯.. Task.RunSynchronously听起来很有希望.

private void WriteToLog(string text)
{
    Task task = …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await windows-store-apps

301
推荐指数
3
解决办法
10万
查看次数

在上下文菜单下单击查找节点

如何找出树列表中的哪个节点已激活上下文菜单?例如,右键单击节点并从菜单中选择一个选项.

我无法使用TreeViews的SelectedNode属性,因为该节点只是右键单击而未选中.

c# treeview contextmenu winforms

69
推荐指数
4
解决办法
5万
查看次数

是否有"未找到字形"字符?

假设我们有一个包含无法显示的Unicode字符的文本,因为我们的字体没有相应的字形.通常,会显示占位符,例如矩形块(见屏幕截图).

是否存在可靠地生成此字形的"字形未找到"字符?我想"If the following text contains <insert character here> then you need another font..."在UI中写一些东西.

顺便说一句,我不是在谈论 (替换角色).当无法从数据流中正确解码Unicode字符时,将显示此字符.它不一定产生相同的字形:

在此输入图像描述

unicode fonts glyph special-characters

24
推荐指数
3
解决办法
1万
查看次数

捕获异常,添加数据并重新抛出它

我有以下代码:

try
{
   OnInitialize();
}
catch (PageObjectLifecycleException exception)
{
   exception.OldLifecycleState = CurrentLifecycleState;
   exception.RequestedLifecycleState = LifecycleState.Initialized;
   throw exception;
}
Run Code Online (Sandbox Code Playgroud)

我捕获一个异常,向它添加更多数据,然后重新抛出它.Resharper警告我(正确)可能需要重新抛出并建议将其更改为:

throw;
Run Code Online (Sandbox Code Playgroud)

但我想知道:这是否会正确地重新修改修改后的异常或未经修改的原始异常?

编辑:回应"试一试"评论:我是C#的新手,来自C++.在C++中,你经常会在这样的角落情况下发现未定义的行为,我感兴趣的是我想要的是它是如何正式工作的.

c# exception

20
推荐指数
3
解决办法
1万
查看次数

StringComparison.InvariantCultureIgnoreCase去了哪里?

我正在将C#代码移植到Windows应用商店应用.令我惊讶的是,以下代码不再起作用:

someString.Equals("someOtherString", StringComparison.InvariantCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

InvariantCultureInvariantCultureIgnoreCase已被删除(*)StringComparison.

为什么?

我该如何更换它?

编辑:(*)严格来说,它尚未删除,它仅适用于Windows应用商店应用.结果是一样的:你不能使用它.

.net c# windows-store-apps

20
推荐指数
2
解决办法
6262
查看次数

使用字符串作为IEnumerable

在.NET for Windows Store Apps中 - 似乎 - 你不能再使用字符串作为Enumerables了.以下代码适用于桌面应用程序,但不适用于应用程序:

public static bool SolelyConsistsOfLetters(string s)
{
    return s.All(c => char.IsLetter(c));
}
Run Code Online (Sandbox Code Playgroud)

错误是

'string'不包含'All'的定义,也没有扩展方法'All'接受'string'类型的第一个参数(你是否缺少using指令或汇编引用?)

但我没有错过装配参考或using System.Linq;.以下代码确实有效:

public static IEnumerable<char> StringAsEnumerable(string s)
{
    foreach (char c in s)
    {
        yield return c;
    }
}

public static bool SolelyConsistsOfLetters(string s)
{
    return StringAsEnumerable(s).All(c => char.IsLetter(c));
}
Run Code Online (Sandbox Code Playgroud)

问题是,s as IEnumerable<char>不起作用(错误:"无法将类型'字符串'转换为'System.Collections.Generic.IEnumerable'(...)")并且s.GetEnumerator()不可用.

我的问题:

  1. 是否真的没有优雅的方法来使用字符串作为Enumerables(没有上面的帮助方法)?我觉得我必须错过一些非常明显的东西.
  2. 由于字符串的行为不像Enumerable,foreach为什么/如何在这里工作?

.net c# string windows-8 windows-store-apps

20
推荐指数
1
解决办法
2万
查看次数

Windows应用商店应用中的页面全局键盘事件

我正在开发一款游戏,一种基于WPF的Windows应用商店应用,用C#编写.当玩家按下Esc键时,我想暂停游戏并显示一个菜单(继续,退出等).

听起来很简单.可悲的是,事实并非如此.

游戏的故事发生在一个Windows.UI.Xaml.Controls.Page和主要由数百Shape在A S Canvas,但没有一个单一的Button,TextBox否则任何支持键盘交互.唯一的互动是点击或点击形状.

我需要在整个页面上全局捕捉键盘事件,无论焦点是什么元素,或者根本没有任何焦点等等.每当按下Esc键时,必须触发一个事件.

我尝试了什么:

  • 使用事件Page.KeyDown或覆盖Page.OnKeyDown(KeyRoutedEventArgs e)(或KeyUp):不会触发,除非有一个元素,如TextBox键盘焦点.但是在我的UI中没有这样的元素.

  • 使用不可见(Opacity = 0和/或隐藏在Canvas下)TextBox作为黑客来使KeyDown工作:只要点击/点击Canvas或任何Shape,TextBox就会失去焦点并且黑客停止工作.因此,需要更多的黑客来保持焦点,这与其他东西(例如菜单按钮)有关.此外,TextBox偶尔会显示Windows软件键盘,这是非常不需要的.一个勉强工作,脆弱的黑客.

  • 使用InputGestures,KeyBinding等:不适用于Windows应用商店的应用程序.

任何想法或解决方案?

c# wpf keyboard-events windows-store-apps

16
推荐指数
2
解决办法
4340
查看次数

自定义Apple菜单

如何自定义Apple菜单?我应该学习哪些SDK等?我想插入一个菜单项:

在此输入图像描述

macos

10
推荐指数
1
解决办法
2470
查看次数

如何规范化字符串?

在.NET中,你可以标准化(NFC,NFD,NFKC,NFKD)字符串,String.Normalize()并且有一个 Text.NormalizationForm枚举.

在.NET for Windows Store应用程序中,两者都不可用.我查看了StringSystem.TextSystem.Globalization名称空间,但没有发现任何内容.

我错过了什么吗?如何规范化Windows应用商店应用中的字符串?

有没有人知道为什么这个Normalize方法不适用于Store Apps?

.net string unicode unicode-normalization windows-store-apps

10
推荐指数
1
解决办法
1818
查看次数

为什么ReSharper会抱怨使用ResourceLoader.GetString?

我有一个Windows 8应用程序,我按照MSDN中的描述进行本地化.我的资源文件使用默认名称("Resources.resw")和位置("Strings\en-US"等).

在此输入图像描述

当我访问资源时ResourceLoader,ReSharper会抱怨.例:

private readonly ResourceLoader _resourceLoader = new ResourceLoader();

private void DoSomething()
{
    string s = _resourceLoader.GetString("TestEntry");
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ReSharper抱怨我正在创建一个模糊的引用,因为在几个资源文件中有几个"TestEntry"键.咄.这就是重点.资源管理应该自动使用正确的资源,确实如此.

那么,为什么ReSharper抱怨?它是在ReSharper的一个bug或者真的出问题了吗?

顺便说一句:ReSharper 建议(在其他相当无用的东西之外)提供放在resource:密钥字符串之前,_resourceLoader.GetString(resource: "TestEntry") (然后抱怨它是多余的).这使得ReSharper警告消失.那是做什么的?这是改进吗?

编辑:哦,我的!我不知何故认为resource:是一些特殊的语法,但它只是一个命名的方法参数 ...

c# resharper localization embedded-resource windows-store-apps

10
推荐指数
1
解决办法
894
查看次数