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

これを行う一般的な方法は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て戻り値(後で)を取得するか、タスクの完了時に実行されるタスク の継続をスケジュールできます。

これは次のようになります。

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 に答える