WebClient.DownloadString()在线程内部不起作用

问题描述 投票:-1回答:1

我有一个包含代码的类

码:

public class getStringClass
{
   public void getMyJson()
   {
      Thread t = new Thread(new ThreadStart(takeit));
      t.IsBackground = true;
      t.Start();
   }

   public void takeit()
   {
      string jsonResult = "Cannot Connect! Try Later.";
      try
      {

         using (WebClient client = new WebClient())
         {
            string url = "some url goes here";
            jsonResult = client.DownloadString(url); //url contains API to get json response, and its valid ,providing json when i checks with browser.
         }
      }
      catch
      {
      }
      MessageBox.Show(jsonResult);
   }
}

没有异常当我捕获异常并打印ex.Message时发生。当我在Form.cs的一些按钮点击事件中使用并提供正确的响应字符串时,此代码可以直接使用。

buttonGetJson_click(object sender, EventArgs e)
{
    getStringClass clsObj = new getStringClass();
    clsObj.getMyJson();     
}

但问题是如果我在我的解决方案中有一个类(例如demo.cs),我从demo类调用此getMyJson(),然后创建getStringClass对象,它不打印响应字符串,它将始终打印默认值消息“无法连接!请稍后再试。”

示例代码

public class demo
{
    public void callJson()
    {
        getStringClass objCls = new getStringClass();
        objCls.getMyJson();
    }
}

这里有什么问题 ?我应该更改WebClient吗?在类中使用Thread时有什么问题吗?或者它是不正确的调用线程的方法?当我使用backgroundworker时也存在同样的问题。

c# json multithreading httprequest webclient
1个回答
0
投票

试试以下代码:

    public void takeit()
    {
        string jsonResult = "Cannot Connect! Try Later.";
        try
        {
            IWebProxy defWebProxy = WebRequest.DefaultWebProxy;
            defWebProxy.Credentials = CredentialCache.DefaultCredentials;

            WebClient clien = new WebClient { Proxy = defWebProxy };

            jsonResult = clien.DownloadString("http://www.google.com");
        }
        catch (Exception ex)
        {
            jsonResult = ex.StackTrace;
        }
        MessageBox.Show(jsonResult);
    }
© www.soinside.com 2019 - 2024. All rights reserved.