代码之家  ›  专栏  ›  技术社区  ›  Leslie Gao

有比穿线更好的方法吗。ASP中的Sleep()。NET API?请参见下面的场景

  •  0
  • Leslie Gao  · 技术社区  · 2 年前

    我正在使用ASP构建一个web应用程序。NET核心Web API。它用于与Linux服务器的SSH通信,所以我必须等待服务器响应。现在我正在使用 Thread.Sleep(2000); 就像下面的代码一样。
    但我相信有更好的方法来做到这一点;大概 Task.Wait ? 在这样的Web API场景中,我应该选择哪一个?

    谢谢

    using System;
    using Renci.SshNet;
    using System.Threading;
    namespace SSHTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Connection information
                string user = "xx";
                string pass = "xx";
                string host = "uxx.ac.uk";
    
                using (var client = new SshClient(host, user, pass))
                {
                    client.Connect();
                    var cmd = client.CreateCommand("echo 123");
                    var asynch = cmd.BeginExecute();
                    while (!asynch.IsCompleted)
                    {
                        //  Waiting for command to complete...
                        Thread.Sleep(2000);
                    }
                    var result = cmd.EndExecute(asynch);
                    Console.WriteLine(result);
                    client.Disconnect();
                }
            }
        }
    }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Quacke    2 年前

    你可以用 asynch.AsyncWaitHandle.WaitOne(); 而不是明确的 while 循环以实现相同的行为。

    或者,你可以把它变成一个值得期待的话题 Task 具有 Task.Factory.FromAsync .

    您的代码如下所示:

    using System;
    using Renci.SshNet;
    using System.Threading;
    namespace SSHTest
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                //Connection information
                string user = "xx";
                string pass = "xx";
                string host = "uxx.ac.uk";
    
                using (var client = new SshClient(host, user, pass))
                {
                    client.Connect();
                    var cmd = client.CreateCommand("echo 123");
                    var result = await Task<string>.Factory.FromAsync(
                        cmd.BeginExecute,
                        cmd.EndExecute
                    );
                    Console.WriteLine(result);
                    client.Disconnect();
                }
            }
        }
    }
    

    我个人会创建一个扩展方法来进行这种转换,并使用它,因为async/await是当今C#中异步编程的标准方法。

    幸运的是已经有了一个 nuget package 这就是你想要的。