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

C# 无法转换lambda表达式(异步/等待),c#,async-await,C#,Async Await,无法将lambda表达式转换为预期的委托类型,因为 块中的某些返回类型不是隐式可转换的 到委托返回类型 我想在另一个线程中运行函数,我可以毫无错误地执行此操作,但仅当计算函数不是void时。我想用void函数。请告诉我如何做,或者它应该返回什么样的结果 private async void buttonStep3_Click(object sender, EventArgs e) { DialogResult dialogResult = folderBr

无法将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
}
private async void按钮步骤3\u单击(对象发送方,事件参数e)
{
DialogResult DialogResult=folderBrowserDialog1.ShowDialog();
if(dialogResult!=dialogResult.OK)
返回;
SetAllButtonsStateEnabled(假);
progressBar1.值=0;
progressBar1.Visible=true;
var progressbarvalue=新进度(s=>progressBar1.Value=s);
等待任务。运行(()=>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),
ProgressBarValue),
TaskCreationOptions.LongRunning);//此行给出一个错误
progressBar1.Visible=false;
progressBar1.值=0;
SetAllButtonsStateEnabled(真);
}
私有无效大小筛选器3(int-filterR1、int-filterH1、,
int filterx2,int filterH2,
int filterW3,int filterH3,
int filterW4,int filterH4,
int filterW5,int filterH5,
i进度(进度值)
{
//一些行动
progressBarValue+=progressBarProgress;
progressBarValue.Report(progressBarValue);
//一些行动
}

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

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);

请注意,您还必须将表达式放在括号中,这样才能工作。

您应该使用任务工厂创建一个长时间运行的任务,该任务接受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
参数。

@Haytam我有。
TaskCreationOptions的参数似乎还有另一个问题。LongRunning
无效;但我相信这是一个单独的问题。是的,但你的代码显示它。。。问题本身来自于
Task.Run
中的
TaskCreationOptions.longlunning
。我明白了,我不知道原始代码的目的是什么。