编程语言
首页 > 编程语言> > C#.Net-如何取消BackgroundWorker从WebService提取数据

C#.Net-如何取消BackgroundWorker从WebService提取数据

作者:互联网

我有以下代码:

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()中的循环.您没有在此处运行(有意义的)循环,因此需要另一种方法.

标签:multithreading,backgroundworker,web-services,c
来源: https://codeday.me/bug/20191107/2003700.html