我有一组从基类继承的命令.基类具有以下声明:
public virtual async Task Execute(object parameter){}
Run Code Online (Sandbox Code Playgroud)
继承类提供了此方法的重写,并非所有类都等待任务.在这些情况下,编译器会生成警告:
这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.
明确提供任务完整返回值是否正确?
public override async Task Execute(object parameter) {
//code containing no await statements...
await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud) 默认行为是当文本框获得焦点时水印消失。我想让水印内容仅在用户键入第一个字符时消失,然后在清除文本后重新出现。有人有好的方法来实现这一点吗?
我在WPF中实现了一种脚本语言,该语言允许用户编写多个并发操作的脚本。这些动作是使用async / await来实现的,所有这些动作都在主线程上运行。
我现在将逐步调试器引入该脚本语言。当前,有一个与脚本引擎关联的窗口,以及与步骤调试器不同的窗口。
我试图在执行脚本操作之前在引擎窗口中停止进程,同时不阻止调试器窗口上的交互。MessageBox.Show()为此特别有用,因为它会暂停动画,动画本身可能会在完成时开始新的动作。
Thread.Sleep()当然根本不起作用,因为每个人都在主线程上。
C#中是否有类似于MessageBox.Show()但没有UI的暂停机制?我试过调用Dispatcher.DisableProcessing(),我可以宣誓可以暂停引擎窗口,但是现在出现错误:
“调度程序处理已暂停,但消息仍在处理中”
我认为理想情况下,我想做这样的事情:
//Engine Window
private debugger;
void RunAction(ScriptAction action){
if(action.BreakPoint){
var pauserObject = PauseProcessesOnThisWindow();
debugger.break(action, pauseObject);
}
}
//Debugger Window
void Continue_Click(){
pauseObject.release();
}
Run Code Online (Sandbox Code Playgroud)
如果必须使用MessageBox方法,则可以看到从另一个窗口关闭它很棘手,更不用说在调试器窗口中具有某些控件是一个笨拙的UI,但是仍然需要用户从引擎窗口。
我很难找到如何在 UWP 中注册 RoutedEventHandler。我正在尝试编写一个具有与 ContentDialog 类似的事件属性的模板控件:
PrimaryButtonClick="ClickEvent"
Run Code Online (Sandbox Code Playgroud)
其中ClickEvent是在cs文件中定义的。我只是刚刚掌握模板的窍门,但我相信我想做一些看起来像这样的事情:
<Button Content="{TemplateBinding PrimaryButtonText}" Click="{TemplateBinding PrimaryButtonClick}"/>
Run Code Online (Sandbox Code Playgroud)
目前,我能找到的只是此类代码的 WPF 版本的引用:
public static readonly RoutedEvent ValueChangedEvent =
EventManager.RegisterRoutedEvent("ValueChanged",
RoutingStrategy.Direct, typeof(RoutedPropertyChangedEventHandler<double>),
typeof(NumericBox));
public event RoutedPropertyChangedEventHandler<double> ValueChanged
{
add { AddHandler(ValueChangedEvent, value); }
remove { RemoveHandler(ValueChangedEvent, value); }
}
private void OnValueChanged(double oldValue, double newValue)
{
RoutedPropertyChangedEventArgs<double> args =
new RoutedPropertyChangedEventArgs<double>(oldValue, newValue);
args.RoutedEvent = NumericBox.ValueChangedEvent;
RaiseEvent(args);
}
Run Code Online (Sandbox Code Playgroud)
但当然类型已经改变了。有人能指出我正确的方向吗?
我正在使用MessageChannel()在页面和iframe之间传递消息。在我的场景中,iframe是通信发起方,包含它的页面接收,转换并响应iframe。
在实施系统时,我首先获取并保存了对传递给iframe的端口的引用,将其缓存并继续用于以后的每次通信。
iframe:
window.onmessage = (e) => {
console.log("iframe port established");
//using this port for all following communications
parentPort = e.ports[0];
onmessage = establishedConnectionHandler;
}
Run Code Online (Sandbox Code Playgroud)
我正在运行所有后续从iframe通过parentPort到父级的通信:
parentPort.postMessage({command, guid, message});
Run Code Online (Sandbox Code Playgroud)
即使文档指出消息通道是一次性通信,这似乎仍然有效,并且使发起通信变得很方便。
我的问题-是受支持的功能还是我正在利用未定义的行为?
编辑-我必须误解了示例MDN的意图:
button.onclick = function(e) {
e.preventDefault();
var channel = new MessageChannel();
otherWindow.postMessage(textInput.value, '*', [channel.port2]);
channel.port1.onmessage = handleMessage;
function handleMessage(e) {
para.innerHTML = e.data;
textInput.value = '';
}
}
Run Code Online (Sandbox Code Playgroud)
在Kaiido的Plunker示例中对此进行了重构。
async-await ×2
c# ×2
wpf ×2
dispatcher ×1
iframe ×1
javascript ×1
textbox ×1
uwp ×1
watermark ×1
xaml ×1