前言:我正在寻找解释,而不仅仅是解决方案.我已经知道了解决方案.
尽管花了几天时间研究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
如何找出树列表中的哪个节点已激活上下文菜单?例如,右键单击节点并从菜单中选择一个选项.
我无法使用TreeViews的SelectedNode属性,因为该节点只是右键单击而未选中.
假设我们有一个包含无法显示的Unicode字符的文本,因为我们的字体没有相应的字形.通常,会显示占位符,例如矩形块(见屏幕截图).
是否存在可靠地生成此字形的"字形未找到"字符?我想"If the following text contains <insert character here> then you need another font..."在UI中写一些东西.
顺便说一句,我不是在谈论 (替换角色).当无法从数据流中正确解码Unicode字符时,将显示此字符.它不一定产生相同的字形:

我有以下代码:
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#代码移植到Windows应用商店应用.令我惊讶的是,以下代码不再起作用:
someString.Equals("someOtherString", StringComparison.InvariantCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
InvariantCulture并InvariantCultureIgnoreCase已被删除(*)StringComparison.
为什么?
我该如何更换它?
编辑:(*)严格来说,它尚未删除,它仅适用于Windows应用商店应用.结果是一样的:你不能使用它.
在.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()不可用.
我的问题:
我正在开发一款游戏,一种基于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应用商店的应用程序.
任何想法或解决方案?
在.NET中,你可以标准化(NFC,NFD,NFKC,NFKD)字符串,String.Normalize()并且有一个 Text.NormalizationForm枚举.
在.NET for Windows Store应用程序中,两者都不可用.我查看了String类System.Text和System.Globalization名称空间,但没有发现任何内容.
我错过了什么吗?如何规范化Windows应用商店应用中的字符串?
有没有人知道为什么这个Normalize方法不适用于Store Apps?
.net string unicode unicode-normalization windows-store-apps
我有一个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