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

时间:2017-12-21 05:32:46

标签: c# json multithreading httprequest webclient

我有一个包含代码的类

代码:

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时也存在同样的问题。

1 个答案:

答案 0 :(得分: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);
    }