好吧基本上我有一个函数返回一个字符串,但要获得该字符串它使用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;
}
}
答案 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
支持。