如何在 C# .NetFramework 4.0 中执行异步和等待如在 .NetFramework 5.0 中?

问题描述

当我添加以下代码来执行异步和等待时,

 namespace loadmultipleimages
 {
    public partial class Form1 : Form
    {
        VideoCapture capture = new VideoCapture();
        delegate void delHugeTask();
     
        public Form1()
        {
           InitializeComponent();
        }
    
        public static /*async*/ Task copyToAsync( this Stream input,Stream output,CancellationToken cancellationToken = default(CancellationToken))
        {
           return copyToAsyncTasks(input,output,cancellationToken).ToTask();
        }

        private  IEnumerable<Task> copyToAsyncTasks(Stream input,CancellationToken cancellationToken)
        {
          byte[] buffer = new byte[0x1000];   // 4 KiB
          while (true)
          {
            cancellationToken.ThrowIfCancellationRequested();
            var bytesReadTask = input.Read(buffer,buffer.Length);
            yield return bytesReadTask;
            if (bytesReadTask.Result == 0) break;

            cancellationToken.ThrowIfCancellationRequested();
            yield return output.Write(buffer,bytesReadTask.Result);
          }
       }
    }
 }

错误公共部分Form1:Form

Form 1下弹出并带有蓝色下划线
   Error    1   Extension method must be defined in a non-generic static class

我知道如果你想使用静态方法,类也必须定义为静态。但是如何解决这个问题?

解决方法

最好的解决方案是将项目的目标框架更改为 4.8 之类的。我知道支持 .NET 4.0 的唯一原因是继续支持 Windows XP。在这种情况下,我建议您向做出该业务决策的人退缩:您是否绝对确定要支持 Microsoft 不支持的操作系统 超过 7 年?对我来说,这似乎有一些严重的责任问题。

但是,假设你无法说服你的老板支持一个古老的操作系统不是一个好主意,你可以使用 Microsoft.Bcl.Async NuGet 包来让 async/await 工作.请注意,这仅适用于桌面应用,不适用于 ASP.NET 应用。