无法从'int'转换为'System.func <int>'

时间:2019-09-06 17:19:47

标签: c#

我正在尝试在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);
}

我希望能够更新此方法,以允许异步编程成功运行

1 个答案:

答案 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线程上保持异步 。重新考虑如何将异步添加到程序中。