繁体   English   中英

从处理方法中返回值

[英]Returning value from a disposed method

我有以下代码:

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();
    }

它以错误“无法访问的区域”结束。

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

我不明白的是它如何在第一部分而不是第二部分中返回值...

谢谢,

UPDATE-我很抱歉,为了使代码能正常工作,我粘贴了错误的代码,然后将其更改为原始代码,这给我带来了麻烦,谢谢

尝试改变

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编写为参数,可以有效地将空字符串传递给方法。 可能是导致错误的原因(假设此错误存在于您的实际代码中,而不仅仅是示例中)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM