c# – 异步将数据发布到主机时的服务器忙消息框
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 异步将数据发布到主机时的服务器忙消息框,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3789字,纯文字阅读大概需要6分钟。
内容图文
![c# – 异步将数据发布到主机时的服务器忙消息框](/upload/InfoBanner/zyjiaocheng/789/b0f0b4f76f57431b9ba824f489497f25.jpg)
我构建了一个Windows窗体应用程序,它通过按钮单击事件将数据(使用POST调用)发送到Web服务.在生产中,有时用户会看到“服务器忙”消息框(如下所示).
我正在使用Async Await模式将消息发布到服务.以下是我的代码片段:
private void button1_Click(object sender, EventArgs e)
{
SendDataToHost();
}
private async void SendDataToHost()
{
//Get the data which needs to be sent to the host..
var result= await PostData(data);
//If the service fails to process this data for any reason, then
// it returns the result object with succeeded as false
if (result != null && !result.Succeeded)
{
MessageBox.Show("Failed");
}
else
{
MessageBox.Show("Success");
}
}
public async Task<Result> PostData(Data data)
{
Result result = await PostAsync("cases", data);
return result;
}
我理解正在填充“服务器忙”消息框,因为UI线程被阻止.但我想要了解的是,使用Async和Await的目的是保持UI响应,但为什么UI线程被阻止?
此外,我在网上进行了研究,并找到了一些解决方案,但我想彻底了解他们是否会解决这个问题?由于这是一个生产问题,我无法在开发环境中重现,我想确保更改将解决问题.
我发现的两个选项是:
1)使用ConfigureWait(false).根据我的理解,这将确保在UI上下文中不会发生“POST”调用.
public async Task<Result> PostData(Data data)
{
Result result = await PostAsync("cases",data).ConfigureAwait(false);
return result;
}
2)在新任务中调用Post方法并等待任务.
private async void SendDataToHost()
{
//Get the data which needs to be sent to the host..
**var result= await Task.Run(()=>PostData(data));**
//If the service fails to process this data for any reason, then
// it returns the result object with succeeded as false
if (result != null && !result.Succeeded)
{
MessageBox.Show("Failed");
}
else
{
MessageBox.Show("Success");
}
}
我想知道我是否朝着正确的方向前进,以解决这个问题
或者我还需要探索其他选择吗?
解决方法:
它是一个非常标准的消息框,许多程序都可以显示它. Here is an example的QuickBooks这样做,谷歌搜索“服务器忙这个动作无法完成”将给你更多的例子.他们提出的解决问题的建议很少有用.
Visual Studio也是具有此功能的应用程序的一个很好的示例.但它不使用标准消息框,而是自定义报告事故的方式.检查this Q+A.
你的问题中没有足够的暗示来猜测“服务器”可能是什么以及它为什么行为不端.它肯定不是一个“网络服务”,有人卖给你一堆马毛,对于一个没有人真正理解的非常古老的代码库来说并不罕见.因此,我将不得不通过解释管道来解决这个问题.消息框由OS内置的COM基础结构显示.当您在COM服务器上进行调用时,它会参与您的程序,并且该调用需要被编组到另一个线程或另一个进程. PostAsync()可能就是那个调用,尽管它没有这种方法的非常典型的名称.也许它被某人包裹起来让它变得异步.
COM基础结构提供的一项服务是监视此类呼叫.确保在合理的时间内完成.在“合理”是60秒的情况下,只要人们愿意等待程序变得无响应时.这样的调用花费太长时间是一个非常严重的可用性问题,它具有使程序的用户界面挂起并且用户失去对程序的控制的诀窍.
消息框的目的是让他知道某些东西是错过的,并且不是你的程序有问题.然而,“切换到”按钮很少具有预期效果,现在不再具有预期效果.在OLE仍然流行的古代,这种事故更为常见,它将帮助用户点击消息框或以其他方式从服务器获取诊断,以找出它不合作的原因.
今天,更可能的原因是火管问题.使用远高于其可执行速率的请求对服务器进行攻击.这是你追求异步代码的可能原因之一,你可能在之前注意到服务器不是很快就能完成它的工作.如果这会使您的UI无响应,但这并不能解决核心问题,这是可以的.实际上它可以使情况变得更糟,你的程序现在可以更快地调用这些调用,从而使firehose问题变得更糟.当服务器备份太多时,最终会触发COM诊断.
没有干净的解决方案,你只需要慢一点,这样你的程序就不会压倒服务器.技术上可以抑制消息框,使其永远不会出现,通常是程序员首先查找的内容.您可以通过编写自己的IMessageFilter接口实现来完成此操作,并通过对CoRegisterMessageFilter()进行调整来告诉COM管道.您将在this MSDN article中找到样板C#代码.
请注意,Register()调用必须由创建COM对象的同一线程进行,如果组件被包装或在非STA工作线程上创建它,则这不一定很简单.你会找到为这样一个组件创建一个好客的家的代码,所以你可以可靠地调用Register()调用in this post.还提供了一种方法来创建自己的队列并避免异步调用,所以你不依赖于COM管道.
内容总结
以上是互联网集市为您收集整理的c# – 异步将数据发布到主机时的服务器忙消息框全部内容,希望文章能够帮你解决c# – 异步将数据发布到主机时的服务器忙消息框所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。