想想这个,
Task task = new Task (async () =>{
await TaskEx.Delay(1000);
});
task.Start();
task.Wait();
Run Code Online (Sandbox Code Playgroud)
调用task.Wait()不等待任务完成,下一行立即执行,但如果我将async lambda表达式包装到方法调用中,代码将按预期工作.
private static async Task AwaitableMethod()
{
await TaskEx.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)
然后(根据svick的评论更新)
await AwaitableMethod();
Run Code Online (Sandbox Code Playgroud) 通过在C#中引入Null-Conditional运算符,进行以下评估,
if (instance != null && instance.Val != 0)
Run Code Online (Sandbox Code Playgroud)
如果我这样改写,
if (instance?.Val != 0)
Run Code Online (Sandbox Code Playgroud)
如果instance是null引用,它将被计算为true ; 它表现得像
if (instance == null || instance.Val != 0)
Run Code Online (Sandbox Code Playgroud)
那么使用这种新语法重写评估的正确方法是什么?
编辑:
instance
是一个从JSON反序列化的大对象的字段.有很多这样的代码,首先检查字段是否在JSON中,如果是,检查Val属性是否不等于常量,只有两个条件都为真,做一些操作.
该代码本身可以被重构,使逻辑流程更加"决策意识"由彼得在他的评论中指出,虽然在这个问题上,我感兴趣的是如何使用null-conditional operators
与!=
.
我试图在WPF中创建一个模糊效果,但我想模糊控件后面的内容(如网格),我不打算模糊网格的内容.
我想做这样的事情.
我想获得具有"系统"孙子的"包"节点,其具有"mtm"属性,并且"mtm"属性的值是"2055".对于以下示例文档,只应返回第一个Package节点.
我用
"/Database/Package[/SystemCompatibility/System[@mtm='2055']]"
Run Code Online (Sandbox Code Playgroud)
但它不起作用.这个表达有什么问题?
<?xml version="1.0" encoding="UTF-8"?>
<Database version="300">
<Package id="6imb05ww" description="ThinkPad Modem Adapter">
<SystemCompatibility>
<System mtm="8742" os="Windows XP" oslang="en" />
<System mtm="2055" os="Windows XP" oslang="jp" />
</SystemCompatibility>
</Package>
<Package id="6imb06ww" description="ThinkPad Modem Adapter">
<SystemCompatibility>
<System mtm="3046" os="Windows XP" oslang="en" />
</SystemCompatibility>
</Package>
</Database>
Run Code Online (Sandbox Code Playgroud) 我注意到Debug.Assert不会在Metro应用程序中触发,但是,如果项目是传统的,如Console或WinForm,它会触发.是的,我处于调试模式.
它是否在Visual Studio(11 Beta)中未正确设置?或Debug.Assert旨在在metro应用程序中禁用?
我知道在执行Metro应用程序期间会吞下许多异常,但Debug.Assert非常方便,我无法想到它应该被禁用的原因.
我有一个从cell_endedit调用的函数.它在dataGridView中移动dataGridViewRow:
private void moveRowTo(DataGridView table, int oldIndex, int newIndex)
{
if (newIndex < oldIndex)
{
oldIndex += 1;
}
else if (newIndex == oldIndex)
{
return;
}
table.Rows.Insert(newIndex, 1);
DataGridViewRow row = table.Rows[newIndex];
DataGridViewCell cell0 = table.Rows[oldIndex].Cells[0];
DataGridViewCell cell1 = table.Rows[oldIndex].Cells[1];
row.Cells[0].Value = cell0.Value;
row.Cells[1].Value = cell1.Value;
table.Rows[oldIndex].Visible = false;
table.Rows.RemoveAt(oldIndex);
table.Rows[oldIndex].Selected = false;
table.Rows[newIndex].Selected = true;
}
Run Code Online (Sandbox Code Playgroud)
在row table.Rows.Insert(newIndex,1)我收到以下错误:
System.Windows.Forms.dll中类型为"System.InvalidOperationException"的未处理异常
附加数据:操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用.
当我在编辑当前单元格时单击另一个单元格时会发生这种情况.如何规避此类错误并正确插入行?
今天我根据UI设计更改更新了Windows应用商店应用.其中一个变化是用a替换CheckBox
a ToggleSwitch
.
所以代码是从更新
<CheckBox IsChecked="{Binding BooleanProperty}" ...
Run Code Online (Sandbox Code Playgroud)
至
<ToggleSwitch IsOn="{Binding BooleanProperty"} ... //does not update data source
Run Code Online (Sandbox Code Playgroud)
然后我注意到切换ToggleSwitch
不会更新底层BooleanProperty
,我必须添加Mode=TwoWay
以使其工作.
<Toggleswitch IsOn="{Binding BooleanProperty, Mode=TwoWay"} ... //update data source
Run Code Online (Sandbox Code Playgroud)
根据我在WPF中学到的知识,我不必Mode=TwoWay
在CheckBox的IsChecked属性上明确设置,因为它是TwoWay
默认的.
通常,用户可编辑的控件属性(例如文本框和复选框的属性)默认为双向绑定,而大多数其他属性默认为单向绑定.
我一直在想的ToggleSwitch
是另一个具有更好触摸支持的CheckBox,它仅适用于Windows应用商店和Windows Phone应用.
为什么ToggleSwitch.IsOn
不默认为TwoWay绑定?CheckBox和ToggleSwitch之间是否还有其他差异?
在StarUML 5.0中,我试图定义一个类型为Guid [](Guid Structure数组)的类.但是不允许输入"-guids:Guid []",因为StarUML会自动丢弃方括号.
我还没有尝试过其他建模工具......只想知道如何使用StarUML.
如果我提供数组的长度,StarUML似乎接受,比如"-guids:Guid [10]",但是在StarUML生成的代码中,这个字段就像是
private Guid guids; //the square brackets are missing;
Run Code Online (Sandbox Code Playgroud)
或者我可以在生成的代码中添加类似"-guids:Guid*"的星号,字段就是这样
private Guid* guids;
Run Code Online (Sandbox Code Playgroud)
这不是我想要的,即使在C++中,指针和数组在概念上是可互换的.(我在C#编码)
我有一个Windows Phone 8.1通用应用程序,我正在努力添加基本的Cortana支持.很多关于这个的文章都是针对Silverlight等的 - 我发现很难找到关于这个的真正好的信息.
到目前为止,如果应用已经运行或暂停,我有激活工作.但是,如果应用程序完全退出,则在激活时它会立即崩溃.我已经尝试过使用Hockey和一个简单的"LittleWatson"例程来捕捉崩溃,但似乎发生得太快就被抓住了.我已经看到一些引用私有测试版并试图获得崩溃转储,但到目前为止我没有任何运气.
这是我的激活码的样子app.xaml.cs
:
protected override void OnActivated(IActivatedEventArgs args) {
base.OnActivated(args);
ReceivedSpeechRecognitionResult = null;
if (args.Kind == ActivationKind.VoiceCommand) {
var commandArgs = args as VoiceCommandActivatedEventArgs;
if (commandArgs != null) {
ReceivedSpeechRecognitionResult = commandArgs.Result;
var rootFrame = Window.Current.Content as Frame;
if (rootFrame != null) {
rootFrame.Navigate(typeof(CheckCredentials), null);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我检查命令结果:
private async Task CheckForVoiceCommands() {
await Task.Delay(1); // not sure why I need this
var speechRecognitionResult = ((App)Application.Current).ReceivedSpeechRecognitionResult;
if (speechRecognitionResult == null) {
return; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的 UWP 应用程序连接到 SignalR Core 集线器。
在 .NET Core 应用程序 (2.1) 中,它运行良好,而在 UWP 中,它在hub.StartAsync()
被调用时抛出异常。
证书颁发机构无效或不正确
这是我的代码:
hub = new HubConnectionBuilder()
.WithUrl("http://localhost:49791/hubs/status")
.Build();
await hub.StartAsync();
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我猜我必须在包清单中配置一些东西,但是什么?
c# ×6
.net ×3
wpf ×2
assert ×1
async-await ×1
async-ctp ×1
cortana ×1
data-binding ×1
datagridview ×1
debugging ×1
effects ×1
evaluation ×1
null ×1
signalr ×1
signalr-hub ×1
staruml ×1
toggleswitch ×1
uwp ×1
windows-8 ×1
xpath ×1