小编jch*_*tof的帖子

async不需要等待的任务方法

我有一组从基类继承的命令.基类具有以下声明:

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)

c# async-await

3
推荐指数
2
解决办法
1956
查看次数

wpf xceed工具包水印文本框使水印显示直到第一次输入

默认行为是当文本框获得焦点时水印消失。我想让水印内容仅在用户键入第一个字符时消失,然后在清除文本后重新出现。有人有好的方法来实现这一点吗?

wpf textbox watermark

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

暂停类似MessageBox.Show()的窗口

我在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,但是仍然需要用户从引擎窗口。

c# wpf dispatcher async-await

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

在 UWP 模板控件中注册 RoutedEventHandler

我很难找到如何在 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)

但当然类型已经改变了。有人能指出我正确的方向吗?

xaml template-control routed-events uwp

0
推荐指数
1
解决办法
1213
查看次数

在页面和iframe之间双向使用MessageChannel()处理多个消息

我正在使用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示例中对此进行了重构。

javascript iframe message-channel

0
推荐指数
1
解决办法
526
查看次数