【问题标题】:How do I use Async in c#?如何在 C# 中使用异步?
【发布时间】:2019-10-28 16:02:15
【问题描述】:

我正在做 c# 表单应用程序。该应用程序基本上是一个视频转换器实现。我有两个按钮,称为转换和转换停止。这就是我想做的;我不希望表单自行锁定,即使我单击其中任何一个。届时我可能会取消该过程或关闭表格。我需要做异步,但我不知道怎么做。我不能使用后台工作人员,因为我基本上是在处理大数据。他可以更多地锁定表格。 请帮忙。

转换停止码;

private void Button7_Click(object sender, EventArgs e)
    {
        var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
        ffmpeg.Stop();
                MessageBox.Show("convert is stopped");
    }

【问题讨论】:

  • await Task.Run(() => { /* Put your CPU-bound code here */ });。不要忘记将 async 修饰符添加到您的事件处理程序中(即 private async void Button7_Click(...).
  • BackgroundWorker 不会锁定表单,你可以使用它。
  • 你应该阅读关于非 ui 阻塞操作here 的 MS 文章以及类似问题的答案here
  • 这段代码到底在哪里?表单是在加载中,还是在您双击按钮时? @ahmed abdelhameed
  • 看起来FFMpegConverter class 公开了启动和停止后台进程的方法。因此,您无需创建自己的线程。我认为您只需要将对对象的引用保留为表单字段而不是局部变量。

标签: c# winforms asynchronous converters


【解决方案1】:

像这样:

private async void Button7_Click(object sender, EventArgs e)
{
    await Task.Run(() => 
    {
        //code here that takes a long time. NB nothing that must be run on the main thread
        var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
        ffmpeg.Stop();
    });
    //when the above task completes this will then be called on the original thread context (i.e. the main ui thread)
    MessageBox.Show("convert is stopped");
}

请注意,MessageBox.Show 将在任务完成后被调用,但控件将在等待调用时返回到主线程。这就是让刚接触异步的人感到困惑的地方。

还请注意,通常异步函数将具有 TaskTask<T> 返回类型,但由于这是一个事件处理程序,它具有 void 返回类型。这是 void 返回类型对于异步函数是正确的少数情况之一。

【讨论】:

  • 我必须异步其他事件吗?
  • @ZeynepBaran Async 不是你的问题。请参阅我和 John Wu 的关于您的问题的 cmets。
  • @Fildor 我认为你是对的!我确实认为 Stop 函数实际上不需要异步运行
  • 不,我只是告诉你我做了什么。我没有任何错误转换器。我的问题是表单中的一个按钮是活动的,我不能使用另一个
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多