好奇怪的webservice异步调用的问题,望高手指教一下

quicklight 2004-12-19 01:14:03
我是做一个dot net 精简版的客户端程序,当中调用webservice来读取数据库中的内容来绑定到一个datagrid,但是出现了一个奇怪的问题,程序如下:

private void BindData(string strJobID, byte byStatus, bool bType)
{
InfoForm Info = new InfoForm();
Info.Parent = this;
Info.Location = new Point(10,40);
Info.Size = new Size(200,100);
Info.FormBorderStyle = FormBorderStyle.FixedToolWindow;
Info.Infomation = "正在获取备件列表,请稍候……";
Info.BringToFront();
if(byStatus == 0)//创建询问请求
{
MainArea.Visible = true;
BackFillArea.Visible = false;
PartNo.Visible = true;
SearchPartInfo.Visible = true;
SearchPart.Visible = true;
PartList.Top = 40;
PartList.Height = 160;
Submit.Visible = true;
PartList.ContextMenu = PartOperation;
if(IsNewJob)
CurJobInfo = new RequestInfo(strJobID);//logical problem here

Info.Show();
resultBindData= server.BeginGetPartsByJobID(strJobID, bType,cbAfterBindData,Info);

}
else if (byStatus == 4)// 报关单回填
{

InitBackFillArea(strJobID);
return;
}
else
{
Submit.Visible = false;
MainArea.Visible = true;
BackFillArea.Visible = false;
PartNo.Visible = false;
SearchPartInfo.Visible = false;
SearchPart.Visible = false;
PartList.Top = 15;
PartList.Height = 210;
PartList.ContextMenu = null;

Info.Show();
resultBindData = server.BeginGetPartsByRequest(strJobID, bType,cbAfterBindData,Info);
}

}
private void AfterBindData(System.IAsyncResult result)
{
InfoForm info = (InfoForm)result.AsyncState;
if(info != null)
info.Close();
DataSet ds;
if(CurNodeData.Status == 0)
ds = server.EndGetPartsByJobID(resultBindData);
else
ds = server.EndGetPartsByRequest(resultBindData);

JobIDShow.Text = "工作单号: " + CurNodeData.JobID;
JobIDShow.Visible = true;
CurPartTable = ds.Tables["PartInfo"];
CurPartIndex = -1;
DataTable table = new DataTable("PartInfo");
table.Columns.Add("备件号",Type.GetType("System.String"));
table.Columns.Add("品名", Type.GetType("System.String"));
table.Columns.Add("HSCODE", Type.GetType("System.String"));
table.Columns.Add("状态", Type.GetType("System.String"));

string strStatus;
foreach(DataRow row in CurPartTable.Rows)
{
DataRow newRow = table.NewRow();
newRow["备件号"] = row["PartNo"];
newRow["品名"] = row["ChineseName"];
newRow["HSCODE"] = row["HSCODE"];

strStatus = StatusArray[(byte)row["Status"]];
if((byte)row["Status"] == 2)
{
if((bool)row["SubStatus"])
{
strStatus += "(A)";
}
else
{
strStatus += "(Q)";
}
}
else if((byte)row["Status"] == 0)//需处理的备件,编辑问题列表
{
string strPartNo = (string) row["PartNo"];
PartInfo part = CurJobInfo.GetPart(strPartNo);
if(part != null)
{
strStatus = "已编辑";
}

}
newRow["状态"] = strStatus;
table.Rows.Add(newRow);
}

PartList.DataSource = table;
PartList.Visible = true;
}

在异步调用中我把前面显示的对话框(InfoForm,主要用于给出一个提示,表明正在读取服务器的信息,让用户等待操作完成)的引用作为AsyncState参数传递给调用,然后在回调函数(AfterBindData)中显示强制转化成InfoForm的变量,然后关闭这个对话框,程序错误就出现在这里,根本就不能继续执行下去,我调试跟踪发现,在港开始进去回调函数时候,result是一个对象,但是执行了强制转换操作之后,result就成了null,太奇怪了,什么地方是的这个IAsyncResult型的变量被释放了呢,实在是不明白
...全文
169 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
quicklight 2004-12-24
  • 打赏
  • 举报
回复
难道精简版不支持异步调用,不会吧,反正感觉好像是异步调用返回时候会发生不可捕获的异常,真是头疼死了
lovemafeilsh 2004-12-21
  • 打赏
  • 举报
回复
我也出现同样问题
quicklight 2004-12-20
  • 打赏
  • 举报
回复
自己Up

12,162

社区成员

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

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