无法转换lambda表达式(异步/等待)

4
无法将 Lambda 表达式转换为预期的委托类型,因为块中的某些返回类型无法隐式转换为委托返回类型。
我想在另一个线程中运行函数,在计算函数不是 void 时,可以无错误地运行函数。我想使用 void 函数,请告诉我如何做或者它应该返回什么样的结果?
private async void buttonStep3_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = folderBrowserDialog1.ShowDialog();
            if (dialogResult != DialogResult.OK)
                return;

            SetAllButtonsStateEnabled(false);

            progressBar1.Value = 0;
            progressBar1.Visible = true;

            var progressProgressBarValue = new Progress<int>(s => progressBar1.Value = s);

            await Task.Run(() => SizeFilter3(
                                    Convert.ToInt32(textBoxSF1W.Text), Convert.ToInt32(textBoxSF1H.Text),
                                    Convert.ToInt32(textBoxSF2W.Text), Convert.ToInt32(textBoxSF2H.Text),
                                    Convert.ToInt32(textBoxSF3W.Text), Convert.ToInt32(textBoxSF3H.Text),
                                    Convert.ToInt32(textBoxSF4W.Text), Convert.ToInt32(textBoxSF4H.Text),
                                    Convert.ToInt32(textBoxSF5W.Text), Convert.ToInt32(textBoxSF5H.Text),
                                    progressProgressBarValue),
                                TaskCreationOptions.LongRunning);//this line gives an error


            progressBar1.Visible = false;
            progressBar1.Value = 0;

            SetAllButtonsStateEnabled(true);
        }
private void SizeFilter3(int filterW1, int filterH1,
                                   int filterW2, int filterH2,
                                   int filterW3, int filterH3,
                                   int filterW4, int filterH4,
                                   int filterW5, int filterH5,
                                       IProgress<int> progressProgressBarValue)
{
       //some actions
       progressBarValue += progressBarProgress;
       progressProgressBarValue.Report(progressBarValue);
       //some actions
}
2个回答

5

您应该使用任务工厂创建一个长时间运行的任务,该任务接受一个lambda表达式:

await Task.Factory.StartNew(() => SizeFilter3(Convert.ToInt32("0"), Convert.ToInt32("0"),
                                              Convert.ToInt32("0"), Convert.ToInt32("0"),
                                              Convert.ToInt32("0"), Convert.ToInt32("0"),
                                              Convert.ToInt32("0"), Convert.ToInt32("0"),
                                              Convert.ToInt32("0"), Convert.ToInt32("0"), 
                                              progressProgressBarValue), TaskCreationOptions.LongRunning);

Task.Run方法没有TaskCreationOptions参数。


-1

您可以将lambda表达式显式转换为Action

Task.Run((Action) (() => SizeFilter3(
                                Convert.ToInt32(textBoxSF1W.Text), Convert.ToInt32(textBoxSF1H.Text),
                                Convert.ToInt32(textBoxSF2W.Text), Convert.ToInt32(textBoxSF2H.Text),
                                Convert.ToInt32(textBoxSF3W.Text), Convert.ToInt32(textBoxSF3H.Text),
                                Convert.ToInt32(textBoxSF4W.Text), Convert.ToInt32(textBoxSF4H.Text),
                                Convert.ToInt32(textBoxSF5W.Text), Convert.ToInt32(textBoxSF5H.Text),
                                progressProgressBarValue)),
                            TaskCreationOptions.LongRunning);

请注意,为了使此功能起作用,您还必须将表达式放在括号中。

@Haytam 我已经这样做了。似乎还有另一个问题,即“TaskCreationOptions.LongRunning”的参数无效;但我认为那是一个单独的问题。 - waldrumpus
是的,但你的代码正在显示它...问题本身来自于Task.Run中的TaskCreationOptions.LongRunning - Haytam
我明白了,我之前并不知道原始代码的意图。 - waldrumpus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接