【问题标题】:Returning value from a disposed method从已处置的方法返回值
【发布时间】:2017-08-14 11:35:04
【问题描述】:

我有以下代码:

public class HttpRequestsHandler
    {
        public static T HttpGetWithContent<T>(string requestUrl)
        {
            using (var handler = new WebRequestHandler())
            {
                handler.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

                using (var httpClient = new HttpClient(handler)
                {
                    BaseAddress = new Uri(requestUrl),
                    Timeout = Timeout.InfiniteTimeSpan
                })
                {
                    using (var response = httpClient.GetAsync(requestUrl).Result)
                    {
                        if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Gone)
                        {
                            var errorMessage = $"HttpRequestTask: Request failed with status {response.StatusCode} for URL: {requestUrl}";
                            throw new HttpException(errorMessage, (int)response.StatusCode);
                        }
                        return response.Content.ReadAsAsync<T>().Result;
                    }
                }
            }
        }
        public static T HttpGetWithContentWrapper<T>(string requestUrl)
        {
            return HttpGetWithContent<T>(requestUrl);
        }
  }

现在当我调用它时:

private void Button_Click(object sender, DoWorkEventArgs e)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (sender, args) =>
        {
            var url = UrlProvider.BuildRequestUrl();
            var date = HttpRequestsHandler.HttpGetWithContent<DateTime>(url);
            //More code...
        };
        worker.RunWorkerCompleted += (sender, args) =>
        {
           //more code...
        };
        worker.RunWorkerAsync();
    }

它就像一个魅力,但是当我使用包装方法时:

private void Button_Click(object sender, DoWorkEventArgs e)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (sender, args) =>
        {
            var url = UrlProvider.BuildRequestUrl();
            var date = HttpRequestsHandler.HttpGetWithContentWrapper<DateTime>(url); //fails here
            //More code...
        };
        worker.RunWorkerCompleted += (sender, args) =>
        {
           //more code...
        };
        worker.RunWorkerAsync();
    }

它以错误“不可访问区域”结束。

现在我想这与我不熟悉的一次性模式有关。据我了解,它用于应用程序中的非托管资源,因此对象仅存在于“使用”中。

我不明白的是它如何在第一部分返回一个值,但在第二部分却不行......

谢谢,

更新 - 抱歉,为了让它正常工作,我对代码进行了这么多操作,我粘贴了错误的代码,我将其更改为给我带来麻烦的原始代码,谢谢

【问题讨论】:

  • return HttpGetWithContent&lt;T&gt;(string requestUrl); 行看起来不对。你确定不应该是return HttpGetWithContent&lt;T&gt;(requestUrl);
  • 只是为了确保 - 两个测试中的 url 完全相同?
  • 是否使用 "return HttpGetWithContent(string requestUrl);" 进行编译 - 我得到 "Invalid expression term 'string'"如果我复制你的代码,“语法错误,',' 预期”
  • 您在 Winforms 应用程序中的任务上使用了.Result,这几乎肯定会死锁。如果你想使用异步代码,你必须一直使用异步代码。

标签: c# .net


【解决方案1】:

尝试改变

public static T HttpGetWithContentWrapper<T>(string requestUrl)
{
    return HttpGetWithContent<T>(string requestUrl);
}

public static T HttpGetWithContentWrapper<T>(string requestUrl)
{
    return HttpGetWithContent<T>(requestUrl);
}

通过编写string requestUrl 作为参数,您实际上是在将一个空字符串传递给您的方法。也许这就是导致错误的原因(假设此错误存在于您的实际代码中,而不仅仅是示例中)。

【讨论】:

  • 您好,我发错了代码,改成正确的,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多