【问题标题】:GetResponse() taking too longGetResponse() 耗时过长
【发布时间】:2011-12-28 23:13:10
【问题描述】:

我正在开发一个 winforms 应用程序。

我有一个验证 URL 的函数。

  private void checkForSPSiteValidity(DataGridView Sites_dataGridView)
    {
        foreach (DataGridViewRow myRow in SharePointSites_dataGridView.Rows)
        {
            try
            {
                DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;

                string url = myRow.Cells[CommonCodeClass.spURL_GridCol].Value.ToString();

                WebRequest req = WebRequest.Create(url);

                WebResponse res = req.GetResponse();

                cell.Value = Image.FromFile(CommonCodeClass.Correct_Icons);

            }
            catch (WebException ex)
            {
                Console.WriteLine(ex.Message);
                if (ex.Message.Contains("remote name could not be resolved"))
                {
                    DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;

                    cell.Value = Image.FromFile(CommonCodeClass.warning_Icon);
                }
            }
        }
    }

这段代码运行良好,我得到了正确的值,但处理它需要很长时间,而且大多数情况下应用程序都会挂起。

我是线程新手,所以有没有办法用它来实现它。 一个例子会很有帮助

如果有其他更好的方法,请告诉我。

谢谢

【问题讨论】:

    标签: c# winforms multithreading asynchronous


    【解决方案1】:

    查看BackgroundWorker 控件。这是一种简单的方法。

    HTH。

    【讨论】:

    • 这很棒......但我在实施它时遇到了一些麻烦......你能帮我解决这个问题吗?就像我如何调用后台功能一样。你能给我看个样品什么的吗
    • 本质上,控件在另一个线程中运行操作。主要是处理 DoWork 事件,最后将 Web 请求的结果传递给 e.Result 属性。您不能直接将其返回到表单,而必须通过 e.Result 将其返回。然后,在表单中,您可以通过此事件 arg 访问结果,并使用它执行您最初需要执行的任何操作。
    【解决方案2】:

    正如您自己指出的解决方案,您必须异步执行提取。 BackgroundWorker 是一个很好的入门类,尤其是因为它是一个原生 WinForms 组件。

    如果您想以更通用的方式解决它,还可以查看 C# 中新的 async 扩展。

    【讨论】:

      【解决方案3】:

      一个很好的方法是使用线程池:

      它易于实施,并且非常适合处理大量请求。

      您还可以指定最大线程数并循环执行 15、25、50 等组,这样您就不会剪掉太多线程并最终剪掉更多线程,这样会有好处。我会玩弄它以找出您何时开始放松优化。

      好消息是(见第一个链接)你传递了一个对象(Object threadContext),它不必是单个值......它可以是一个数组、一个列表等,它被转换为目的。在使用列表等时,您可能需要查看一下线程安全=,但我觉得这可能比您现在使用线程所做的更多。

      .

      .

      如果有帮助请评价。

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        • 2019-08-02
        相关资源
        最近更新 更多