2

好的,所以基本上我有一个返回字符串的函数,但是要获取该字符串,它使用 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;
    }
}
4

1 回答 1

3

这样做的一种常见方法是使用 aTask<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以获取返回值(稍后),或者安排任务的延续,该任务将在完成时运行。

这可能看起来像:

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

这也与C# 5 中的新await/支持完美配合。async

于 2013-02-13T00:07:32.877 回答