我在C#中使用asp.net开发了一个网站。
当用户点击按钮时,我必须从服务器收集一些数据并显示结果。我的代码是这样的:
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
string string1 = new MyServer1().SendRequest("Request1");
string string2 = new MyServer2().SendRequest("Request2");
string string3 = new MyServer3().SendRequest("Request3");
string string4 = new MyServer4().SendRequest("Request4");
Response.Write(string1 + string2 + string3 + string4);
}
}
每个SendRequest
方法需要很长时间(在20到40秒之间)才能返回结果。是否可以同时运行所有SendRequest
方法并且所有方法都已执行显示结果?
答案 0 :(得分:1)
解决方案是以异步模式运行上述请求。基本上,您需要将对new MyServerX().SendRequest("RequestX");
的调用包装到一个进程,该进程将控制权立即返回给调用者,而不必等待它完成。
请参阅Asynchronous Programming with Async and Await。这应该有所帮助。
答案 1 :(得分:1)
您可以使用TaskFactory.StartNew()异步运行多个任务。每次通话都会返回Task<string>
。然后使用WaitAll
等待所有任务完成。返回值将在Result
属性中提供。
以下示例将在20秒内执行,而不是80:
namespace ConsoleApplication6
{
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
var tasks = new Task<string>[4];
tasks[0] = Task.Factory.StartNew(() => new MyServer1().SendRequest("Request1"));
tasks[1] = Task.Factory.StartNew(() => new MyServer2().SendRequest("Request2"));
tasks[2] = Task.Factory.StartNew(() => new MyServer3().SendRequest("Request3"));
tasks[3] = Task.Factory.StartNew(() => new MyServer4().SendRequest("Request4"));
Task.WaitAll(tasks);
var string1 = tasks[0].Result;
var string2 = tasks[1].Result;
var string3 = tasks[2].Result;
var string4 = tasks[3].Result;
Console.WriteLine("{0} {1} {2} {3}", string1, string2, string3, string4);
}
}
public abstract class MyServer
{
public string SendRequest(string request)
{
Thread.Sleep(20000);
return request.Replace("Request", "Response");
}
}
public class MyServer1 : MyServer {}
public class MyServer2 : MyServer {}
public class MyServer3 : MyServer {}
public class MyServer4 : MyServer {}
}
Response1 Response2 Response3 Response4
Press any key to continue . . .