c# async

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("开始执行主线程");

        // 调用异步方法
         DoSomethingAsync();

        Console.WriteLine("主线程继续执行其他操作");

        // 在主线程执行其他操作
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("主线程正在执行其他操作:" + i);
            await Task.Delay(500);
        }

        Console.WriteLine("主线程执行完成");
        Console.ReadKey();
    }

    static async Task DoSomethingAsync()
    {
        Console.WriteLine("异步方法开始");

        // 模拟耗时操作,使用 Task.Delay 来进行延迟
        await Task.Delay(2000);

        Console.WriteLine("异步方法完成");
    }
}

开始执行主线程
异步方法开始
主线程继续执行其他操作
主线程正在执行其他操作:0
主线程正在执行其他操作:1
主线程正在执行其他操作:2
主线程正在执行其他操作:3
异步方法完成
主线程正在执行其他操作:4
主线程执行完成

Main 方法是一个异步方法,由于其标记了 async 关键字,可以使用 await 关键字等待一个异步操作完成。不加await,相当于不等待线程完成继续往下执行。

在C#中,声明一个方法为async使其成为一个异步方法,但它并不意味着方法内部的代码就是异步执行的。异步方法的主要特点是可以使用await关键字来暂停当前方法的执行,等待异步操作完成后再继续执行。

例如,在异步方法中可以使用Task.Delay、HttpClient.GetAsync等方法来进行异步操作,而无需使用Task.Run或其他方法将操作包装在Task或Task中。C#编译器会自动帮助我们生成异步状态机以处理异步操作。

IAsyncResult

IAsyncResult 是 .NET 中用于表示异步操作的接口,它提供了一种标准的方式来跟踪和管理异步操作的状态和结果。

IAsyncResult 接口定义了以下几个基本的属性和方法:

  1. AsyncState:获取与异步操作关联的自定义对象。这个属性可以用来传递额外的状态信息给异步操作,从而方便在异步操作完成后进行处理。

  2. AsyncWaitHandle:获取一个 WaitHandle 对象,可以通过它来同步等待异步操作完成。

  3. CompletedSynchronously:获取一个布尔值,表示异步操作是否同步完成。如果异步操作是同步完成的,则为 true,否则为
    false。

  4. IsCompleted:获取一个布尔值,表示异步操作是否已完成。如果异步操作已完成,则为 true,否则为 false。

  5. AsyncCallback:获取一个回调方法,当异步操作完成时,将通过这个回调方法通知调用者。

  6. EndInvoke:在异步操作完成后,通过调用这个方法来获取异步操作的返回值(如果有返回值)。

使用 IAsyncResult 接口的一般流程如下:

调用异步方法时,获得一个实现了 IAsyncResult 接口的对象。

可以使用 AsyncWaitHandle 属性来进行同步等待异步操作的完成,也可以使用回调方法来处理异步操作完成的通知。

使用 IsCompleted 属性检查异步操作是否已完成。如果完成,则可以调用 EndInvoke
或其他适当的方法来获取结果或执行其他后续操作。

在异步操作完成后,可以通过回调方法或其他方式来处理异步操作的结果。

BeginUploadFile 异步上传文件使用示例

using System;
using System.IO;
using System.Net;
using Renci.SshNet;

class Program
{
    static SftpClient sftpClient;
    
    static void Main()
    {
        string host = "example.com";
        int port = 22;
        string username = "your_username";
        string password = "your_password";
        string localFilePath = "local_file.txt";
        string remoteFilePath = "/path/to/remote_file.txt";
        
        sftpClient = new SftpClient(host, port, username, password);
        sftpClient.Connect();
        
        FileStream fileStream = File.OpenRead(localFilePath);
        
        AsyncCallback callback = new AsyncCallback(UploadFileCallback);
        
        IAsyncResult asyncResult = sftpClient.BeginUploadFile(fileStream, remoteFilePath, callback, null);
        
        Console.WriteLine("开始异步上传文件...");
        
        // 在这里可以执行其他操作
        
        // 等待异步上传操作完成
        asyncResult.AsyncWaitHandle.WaitOne();
        
        Console.WriteLine("文件上传完成");
        
        sftpClient.Disconnect();
        sftpClient.Dispose();
    }
    
    static void UploadFileCallback(IAsyncResult asyncResult)
    {
        sftpClient.EndUploadFile(asyncResult);
        Console.WriteLine("文件上传回调函数执行");
    }
}

你可能感兴趣的:(C#,c#,开发语言,服务器)