在asp.net中同时执行代码行

时间:2015-09-08 09:53:21

标签: c# asp.net asynchronous

我在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方法并且所有方法都已执行显示结果?

2 个答案:

答案 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 . . .