【问题标题】:Async http request using ThreadPool.QueueUserWorkItem not sending request when called from unit test从单元测试调用时,使用 ThreadPool.QueueUserWorkItem 的异步 http 请求未发送请求
【发布时间】:2014-06-20 18:30:01
【问题描述】:

我有以下静态类,它有一个发送方法,用于触发并忘记异步 http 调用。

public static class AsyncHttpRequest
{
    public static void Send(string url)
    {
        //perform an async get on the url
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    response.Close();
                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }
}

从 Web 应用程序项目调用相同的 URL 效果很好。但是从单元测试项目调用相同的 URL 是行不通的。它没有调用 URL。我签入了提琴手。这是为什么呢?

在这两种情况下,我都是这样打电话的 -

AsyncHttpRequest.Send("http://example.com");

【问题讨论】:

  • 你有没有试过放断点,看看你是否点击了 request.GetResponse() 行?

标签: c# asp.net .net asp.net-mvc unit-testing


【解决方案1】:

从 Web 应用程序项目调用相同的 URL 效果很好。但是从单元测试项目调用相同的 URL 是行不通的。它没有调用 URL。我签入了提琴手。这是为什么呢?

因为单元测试框架可以快速处理所有内容。退出单元测试需要等待。

[TestMethod]
public void TestMethod()
{
    ManualResetEvent evt = new ManualResetEvent(false);

    AsyncHttpRequest.Send("someUrl", x => evt.Set());

    Assert.True(evt.Wait(100));
}

还有班级

public static class AsyncHttpRequest
{
    public static void Send(string url)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    response.Close();
                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }

    public static void Send(string url, Action<HttpWebResponse> callback)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    callback(response)
                    response.Close();

                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }
}

【讨论】:

  • 你是对的......它在发送请求之前退出并处理了所有内容。
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多