我有以下代码:
void ReferenceManager_DoWork(object sender, DoWorkEventArgs e)
{
try
{
// Get the raw data
byte[] data = this.GetData(IvdSession.Instance.Company.Description, IvdSession.Instance.Company.Password);
// Deserialize the list
List<T> deseriaizedList = null;
using (MemoryStream ms = new MemoryStream(data))
{
deseriaizedList = Serializer.Deserialize<List<T>>(ms);
}
// Convert the list to the Reference Interface
List<IReference> referenceList = new List<IReference>();
foreach (T entity in deseriaizedList)
{
IReference reference = (IReference)entity;
referenceList.Add(reference);
}
e.Result = referenceList;
}
catch (WebException)
{
e.Result = null;
}
}
该代码基本上是在调用WebService方法的委托.不幸的是,我使用后台工作程序的主要原因是在加载数据时停止UI冻结.我弹出一个表格,请稍等,请单击此处取消.
在单击取消时,我在后台工作程序上调用CancelAsync.现在,由于我没有循环播放,所以看不到检查取消的好方法.我唯一看到的选择是拥有…
byte[] m_CurrentData;
…在方法之外,并在DoWork(..)的开头启动新线程,该线程调用Web服务以填充m_CurrentData.然后,我需要执行循环检查(如果已取消)或检查m_CurrentData是否不再为null.
有什么更好的办法可以取消吗?
解决方法:
实际工作似乎在this.GetData(…)方法内部完成,未显示.我知道它正在调用Web服务.您可能应该在代理对象上调用Abort()方法,以使客户端停止等待响应.调用CancelAsync()没有任何意义,只需确保正确检查RunWorkerCompleted()中的错误即可.最简单的方法可能是不捕获_DoWork()中的任何异常,而是检查Completed()中的Result.Error属性.无论如何,您应该这样做.
为了澄清起见,CancelAsync()方法仅用于停止DoWork()中的循环.您没有在此处运行(有意义的)循环,因此需要另一种方法.