C#使用返回变量的函数进行线程处理

时间:2013-02-13 00:02:46

标签: c# function

好吧基本上我有一个函数返回一个字符串,但要获得该字符串它使用webrequest,这意味着当它正在执行webrequest时,表单会被锁定,除非我把它放在另一个线程中。

但我无法找到一种方法来捕获线程中返回的数据,因为它已经开始使用thread.start而且这是一个空白。

请帮忙吗?

当前代码如果对任何人都很重要:

string CreateReqThread(string UrlReq)
{
    System.Threading.Thread NewThread = new System.Threading.Thread(() => CreateReq(UrlReq));
    string ReturnedData = "";
    return ReturnedData;
}

string CreateReq(string url)
{
    try
    {
        WebRequest SendReq = WebRequest.Create(url);

        SendReq.Credentials = CredentialCache.DefaultCredentials;
        SendReq.Proxy = WebRequest.DefaultWebProxy;                 //For closed port networks like colleges
        SendReq.Proxy.Credentials = CredentialCache.DefaultCredentials;
        SendReq.Timeout = 15000;

        System.IO.StreamReader Reader = new System.IO.StreamReader(SendReq.GetResponse().GetResponseStream());
        string Response = Reader.ReadToEnd();
        Reader.Close();
        return Response;
    }
    catch (WebException e)
    {
        EBox(e.Message, "Unknown Error While Connecting");
        return null;
    }
}

1 个答案:

答案 0 :(得分:3)

执行此操作的常用方法是使用Task<T>而不是线程:

Task<string> CreateReqThread(string UrlReq)
{
    return Task.Factory.StartNew() => CreateReq(UrlReq));

    // In .NET 4.5, you can use (or better yet, reimplement using await/async directly)
    // return Task.Run(() => CreateReq(UrlReq));
}

然后,您可以在需要时调用Task<T>.Result以获取返回的值(稍后),或者在完成任务时调度 continuation

这看起来像是:

var request = CreateReqThread(theUri);
request.ContinueWith(t =>
{
     // Shove results in a text box
     this.textBox.Text = t.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());

这也适用于C#5中新的await / async支持。