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

标签 c# web-services multithreading backgroundworker

我有以下代码:

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 方法的委托(delegate)。不幸的是,我使用后台 worker 的主要原因是在加载数据时阻止 UI 卡住。我有一个弹出的表格,上面写着请稍候,单击此处取消。

在单击取消时,我在后台工作程序上调用 CancelAsync。现在,由于我没有循环,所以看不到检查取消的不错方法。我能看到的唯一选择是......

byte[] m_CurrentData;

...在方法之外并在 DoWork(..) 开始时启动一个新线程,调用 web 服务来填充 m_CurrentData。然后我需要执行循环检查是否取消或检查 m_CurrentData 是否不再为空。

有没有更好的方法来实现取消?

最佳答案

实际工作似乎是在未显示的 this.GetData(...) 方法中完成的。我知道它正在调用网络服务。您可能应该调用代理对象上的 Abort() 方法来阻止客户端等待响应。调用 CancelAsync() 没有意义,只需确保正确检查 RunWorkerCompleted() 中的错误即可。最简单的方法可能是_DoWork() 中捕获任何异常,而是检查Completed() 中的Result.Error 属性。无论如何你都应该这样做。

澄清一下,CancelAsync() 方法仅用于停止 DoWork() 内的循环。您没有在那里运行(有意义的)循环,因此需要另一种方法。

关于C#.Net - 如何取消从 WebService 中提取数据的 BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/972048/

相关文章:

Java代码从不进入try-catch中的try block

c# - 任务和异常静默

c# - 我如何知道我的电子邮件是否已被接收并使用 Asp.net 阅读

c# - Mono C# WinForms -> 在 Mac OSX 上运行时出现严重的性能问题

c# - 创建一个国际网站

c# - 超时异常导致SqlDataReader关闭?

java - 在生成的 Restful Web 服务中获取更多查询

asp.net - jquery ajax调用后如何重新加载asp.net GridView?

c++ - 等待多个线程通知的条件变量的正确方法

java - Java中一个线程池的核心线程为什么不能在初始阶段复用?