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