ASP.NET 多线程调用WebService

lilin0503 2014-02-16 03:27:11
asp.net 中一个数据编辑页面,数据修改完成后需要将修改后的数据以字符串的形式作为参数调用webservice方法来调用邮件提醒服务; webservice调用由于用时较长,用户体验很不好,所以考虑多线程调用该webservice,即我调用后不用等待,不管返回结果,直接返回页面;使用多线程的方式该如何实现,请赐教
...全文
358 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilin0503 2014-02-17
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
如果不需要处理UI,那么写个
ThreadPool.QueueUserWorkItem(h =>
{
     ......你的不需要等待结果的处理
}
就足够了。
问题解决了 谢了
  • 打赏
  • 举报
回复
如果不需要处理UI,那么写个
ThreadPool.QueueUserWorkItem(h =>
{
     ......你的不需要等待结果的处理
}
就足够了。
lilin0503 2014-02-16
  • 打赏
  • 举报
回复
上面代码中
awokservice.SendEmail(param.Awokecode, Theme, emailContent); 
这句调用webservice 因为耗时,后面的代码会等待执行,但我不需要webservice的返回值,所以需要调用webservice后不等待继续后面的代码,然后返回前端提示
lilin0503 2014-02-16
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
asp.net? 对于asp.net没有这个能力进行这类编程。你可以考虑改为客户端直接访问,而不是通过asp.net。
不好意思,你的意思是asp.net的后台代码不能多线程吗?我把代码贴上来吧
if (ProductInfoHelper.PDTHelper.UpdateTemplateData(factTalbes) > 0)
                {
                    foreach (FactTalbeModel factTB in factTalbes)  //设置变更提醒
                    {
                        Theme = factTB.TableNameCN + "  变更记录";
                        pks = string.Empty;
                        foreach (KeyValuePair<string, string> pk in factTB.PkAndValue)
                        {
                            pks += pk.Value + "|";
                        }
                        if (pks.Length > 1)
                        {
                            pks = pks.Substring(0, pks.Length - 1);
                        }
                        foreach (QueryParameter param in factTB.QueryParameters)
                        {
                            if (param.Isawoke)
                            {
                                emailContent = string.Empty;
                                if (string.IsNullOrEmpty(param.DataType))
                                {
                                    if (param.Oldvalue.ToString() != param.Value.ToString())
                                    {
                                        emailContent = "变更一项:" + pks + "\r\n" + ";    属性名:" + param.NameCN + "\r\n" + ";    原值:" + param.Oldvalue.ToString() + "\r\n" + ";     新值:" + param.Value.ToString();
                                        awokservice.SendEmail(param.Awokecode, Theme, emailContent);   //就是这里调用webservice 耗时较长,但我不需要等待service的结果而继续执行后面的代码 
                                    }
                                }
                                else if (param.DataType == "DATE")     //时间类型 特殊处理
                                {
                                    DateTime newTime = DateTime.Parse(param.Value.ToString());
                                    string newValue = newTime.ToString("yyyy-MM-dd");
                                    if (newValue != param.Oldvalue.ToString())
                                    {
                                        emailContent = "变更一项:" + pks + "\r\n" + ";    属性名:" + param.NameCN + "\r\n" + ";    原值:" + param.Oldvalue.ToString() + "\r\n" + ";     新值:" + newValue;
                                        awokservice.SendEmail(param.Awokecode, Theme, emailContent);
                                    }
                                }
                            }
                        }
                    }
                    ScriptManager.RegisterStartupScript(btnSave, typeof(Button), "", "<script>EditSuccess();</script>", false);
                }
                else
                {

                    ScriptManager.RegisterStartupScript(btnSave, typeof(Button), "", "<script>EditFail();</script>", false);
                }
  • 打赏
  • 举报
回复
asp.net? 对于asp.net没有这个能力进行这类编程。你可以考虑改为客户端直接访问,而不是通过asp.net。
  • 打赏
  • 举报
回复
嗯,少了两个括号。 var session = new session{ xyz= 123, abc= "adfas"}; ThreadPool.QueueUserWorkItem(h => { ......使用session继续处理,例如访问web service服务; control1.Dispacher.BeginInvoke(new Action(()=> control1.Text = "result")); } FollowMethod(); 意思是一样的,就是在你的子线程中该干什么还是去干什么。只不过操作UI控件时才要考虑到 BeginInvoke 操作。
  • 打赏
  • 举报
回复
和任何别的多线程编程都是一样的。 例如你可以写
var session = new session{ xyz= 123, abc= "adfas"};
ThreadPool.QueueUserWorkItem(h =>
{
     ......使用session继续处理,例如访问web service服务;
     control1.Dispacher.BeginInvoke(new Action(()=>{
         control1.Text = "result";
}
FollowMethod();
这里,FollowMethod不等访问web service的行为开始,就执行了。
lilin0503 2014-02-16
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
asp.net的“多线程”其实没有什么意义。 你应该用异步加载模式,借助signalr可以方便地让后台任务结束的时候通知客户端。
我想要的结果就是:调用webservice后不用等待返回的结果,执行后面的数据库插入操作,然后执行页面response ,所以不管webservice的结果如何
devmiao 2014-02-16
  • 打赏
  • 举报
回复
asp.net的“多线程”其实没有什么意义。 你应该用异步加载模式,借助signalr可以方便地让后台任务结束的时候通知客户端。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧