我正在尝试在Windows窗体应用程序中实现异步编程,并且在尝试返回任务时收到此错误消息。我不知道如何将“ int”转换为“ System.Func”。
我返回的是int而不是布尔值,因为当我尝试返回布尔值时,出现错误,指出异步方法必须返回int或任务。
private async void Button1_Click(object sender, EventArgs e)
{
Task<int> task = new Task<int>(CheckForFiles());
task.Start();
label1.Text = "Checking for file...";
int FilesPresent = await task;
if (FilesPresent == 1)
{
label1.Text = "file present";
}
else
{
label1.Text = "file missing";
}
}
private int CheckForFiles()
{
int fileExists = 0;
bool result = File.Exists(@"FileLocation");
if (result == true)
{
fileExists = 1;
}
else
{
fileExists = 0;
}
return (fileExists);
}
我希望能够更新此方法,以允许异步编程成功运行
答案 0 :(得分:6)
首先,我要说:您这样做根本上是错误的。您不想创建新线程来执行IO任务,这就是您要尝试做的事情。但这不是现在阻止您的问题。
您的代码问题已使CheckForFiles
引起混淆,这是一个常见错误-这是一个函数,它返回一个整数,而CheckForFiles()
是一个< em> execution ,因此是 integer 。
您不希望这样:
Task<int> task = new Task<int>(CheckForFiles());
与
相同int result = CheckForFiles();
Task<int> task = new Task<int>(result);
这显然是胡说八道。您想要的是:
Task<int> task = new Task<int>(CheckForFiles);
即不要调用该函数;通过该功能完成任务。
如果代码更复杂,也可以使用lambda:
Task<int> task = new Task<int>(() => CheckForFiles());
或者如果您需要多个语句:
Task<int> task = new Task<int>(() => { return CheckForFiles(); } );
我返回的是int而不是布尔值,因为当我尝试返回布尔值时,出现错误,指出异步方法必须返回int或任务。
然后,您也在做其他错误的事情。您应该能够使CheckForFiles
返回bool
并使用Task<bool>
。
但是再次不要创建新线程来执行IO任务。这与Windows窗体中的整个异步思想背道而驰,这就是我们要使IO任务在UI线程上保持异步 。重新考虑如何将异步添加到程序中。