我有一个带有TextBox的对话框,可以触发TextChanged事件。当输入的文本长度大于1时,它向Web服务发出请求以获取匹配数据。 Web服务正在使用TaskCompletionSource。
当不需要Web服务调用时,我可以看到在与打开对话框的方法相同的线程上调用TextChanged方法。同样,如果我在Web服务调用上使用TaskCompletionSource .Result获取结果,则再次使用相同的线程。
但是,如果我将TextChanged方法更改为'async'并使用'await'与Web服务调用,我突然看到TextChanged方法移动到另一个线程(使用Visual Studio Parallel Stacks查看器)和我的调用更新对话框中的控件失败并出现跨线程异常。
我没有在方法链中使用任何Task.Run。我不明白为什么一个新线程被启动导致需要在我的对话框控件上使用Invoke。任何人都可以解释为什么会发生这种情况以及是否有解决办法。
答案 0 :(得分:0)
经过大量调试后,我发现创建对话框的方法是在对话框中调用异步方法并使用ConfigureAwait(false)。这导致创建一个新线程。如果我在textchanged事件中向Web服务调用添加了ConfigureAwait(false),我也有了一个新线程。
因此我想在使用ConfigureAwait(false)时需要注意。关于此欢迎的任何提示或提示。
答案 1 :(得分:0)
对于这种情况,您应该考虑使用Reactive Extensions (Rx)。
关于这个问题,我在Nokia Developer Wiki上有几篇文章:
我没有TextBox的例子,但我确信你很容易找到一个,因为它是规范的样本。随着节流和所有。
还有一个StackOverflow标记:system.reactive