我们最近开始研究一个新应用程序,该应用程序将用于非常有限带宽的环境中。因为我的设计师担心加载数据的时间。取消对存储过程的调用
目前我们有一个系统,如下所示:
一个ListView充满了出货量,点击出货显示了侧面板。 侧面板上有一个“Details”按钮,点击此按钮将进行存储过程调用以加载所选货件的详细信息。
现在在我们以前的应用程序中,这不是线程化的,加载时间很短以至于不会引起任何问题(位于内部网络上)。然而,由于新的限制,我们现在将调用过程调用并显示加载动画,但是我的设计人员想要添加取消加载的功能。
这是我卡住的地方,因为按钮调用我的静态库(LoadDetails)上的单个方法我看不到一种方法来取消此加载。除此之外,用户可以选择货件点击细节,然后选择第二个,第三个货件点击所有这些细节,并对多个线程加载数据进行后台处理。
资源库LoadDetails如下:
private static bool LoadDetails(int shipmentId)
{
DataConnection dbCon = null;
try
{
dbCon = ApplicationRoleService.EnableAppRole();
if (dbCon.SqlConn == null)
{
return false;
}
SqlCommand cmd = new SqlCommand("LBN.sel_shipments_details");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = dbCon.SqlConn;
SqlParameter paramShipmentId = new SqlParameter();
paramShipmentId.ParameterName = "shipment_id";
paramShipmentId.Direction = ParameterDirection.Input;
paramShipmentId.Value = shipmentId;
cmd.Parameters.Add(paramShipmentId);
SqlParameter paramReturn = new SqlParameter();
paramReturn.ParameterName = "@return_value";
paramReturn.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(paramReturn);
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adp.Fill(ds);
if ((int)paramReturn.Value < 0)
{
//TODO: Log Error here.
log.Error("Get Shipment Details Failed.");
}
foreach (DataRow row in ds.Tables[0].Rows)
{
App.Current.Dispatcher.Invoke((System.Action)delegate
{
Shipment s = GetShipment(shipmentId);
s.ShipmentDetails(
row["bankContact"] as string,
row["bankContactTel"] as string,
(row["containerCount"] == DBNull.Value) ? 0 : (int)row["containerCount"],
(row["sentToSiteComp"] == DBNull.Value) ? 0 : (int)row["sentToSiteComp"],
(row["arrivedAtSiteComp"] == DBNull.Value) ? 0 : (int)row["arrivedAtSiteComp"],
(row["sentToPortComp"] == DBNull.Value) ? 0 : (int)row["sentToPortComp"],
(row["depostRecComp"] == DBNull.Value) ? 0 : (int)row["depostRecComp"]
);
});
}
IoC.Get<IEventAggregator>().PublishOnUIThread(new ShipmentDetailsLoaded());
return true;
}
catch (Exception ex)
{
log.Error("Unable to get ShipmentsList.", ex);
return false;
}
finally
{
ApplicationRoleService.CloseConnection(dbCon);
}
}
我怎么可能去加入取消从主线程这种方法的能力吗?
您正在为每个LoadDetails创建一个新线程?你不能使用thread.abort()吗?或者你想取消存储过程调用? – artm 2014-10-02 11:06:42
如果是带宽瓶颈,那么最耗费资源的操作就是DataAdapter.Fill(你必须通过网读取所有数据);使它异步,并让它被取消请参阅http://stackoverflow.com/questions/2108917/sqldataadapter-fill-asynchronous-approach – 2014-10-02 11:07:29
还有SqlCommand.Cancel – artm 2014-10-02 11:09:20