任务返回类型错误- x的返回类型错误

本文关键字:返回类型 错误 任务 | 更新日期: 2023-09-27 18:05:47

我有一行代码,那就是:

bool stop = await Task<bool>.Factory.StartNew(Listen, (TcpClient) client);

和相应的任务:

public static async Task<bool> Listen(object state)
{
    TcpClient client = (TcpClient) state;
    NetworkStream connectionStream = client.GetStream();
    IPEndPoint endPoint = client.Client.RemoteEndPoint as IPEndPoint;
    byte[] buffer = new byte[4096];
    Encoding encoding = Encoding.UTF8;
    Random randomizer = null;
    // Are we still listening?
    bool listening = true;
    // Stop the server afterwards?
    bool stop = false;
    while (listening)
    {
        int bytesRead = await connectionStream.ReadAsync(buffer, 0, buffer.Length);
        if (bytesRead > 0)
        {
            // Create a new byte array for recieved data and populate
            // with data from buffer.
            byte[] messageBytes = new byte[bytesRead];
            Array.Copy(buffer, messageBytes, messageBytes.Length);
            // Generate a message from message bytes.
            string message = encoding.GetString(messageBytes);
            switch (message)
            {
                /*
                Message handling, where one can set stop to true.
                */
            }
        }
        if (bytesRead == 0 || listening == false)
        {   
            client.Client.Dispose();
            break;
        }
    }
    return stop;
}

我在代码中保留了主要部分,因为我觉得它们不会影响问题的性质。

所以是的,当运行应用程序时,我得到一个错误:

76: <..>'Program.cs(63,63): Error CS0407: 'System.Threading.Tasks.Task<bool> SOQAsyncQuit.MainClass.Listen(object)' has the wrong return type (CS0407) (SOQAsyncQuit)

嗯,我试过await Task.Factory.StartNew(...),但后来我最终得到了一个不同的错误:

76: <..>'Program.cs(35,35): Error CS0121: The call is ambiguous between the following methods or properties: 'System.Threading.Tasks.TaskFactory.StartNew(System.Action<object>, object)' and 'System.Threading.Tasks.TaskFactory.StartNew<System.Threading.Tasks.Task<bool>>(System.Func<object,System.Threading.Tasks.Task<bool>>, object)' (CS0121) (SOQAsyncQuit)  
76: <..>'Program.cs(57,57): Error CS0407: 'System.Threading.Tasks.Task<bool> SOQAsyncQuit.MainClass.Listen(object)' has the wrong return type (CS0407) (SOQAsyncQuit)
76: <..>'Program.cs(29,29): Error CS0029: Cannot implicitly convert type 'void' to 'bool' (CS0029) (SOQAsyncQuit)

我有工作void任务,这正是我期待转换成一个类型的结果。由于我是c#和。net的新手,所以我在这里没有线索。

我也一直在挖掘:http://msdn.microsoft.com/en-us/library/hh524395.aspx, http://msdn.microsoft.com/en-us/library/dd537613(v=vs.110).aspx,一些关于SO的问题,虽然,他们都不使用Task.Factory.StartNew,我无法将它们连接在一起。

有什么问题吗?

任务返回类型错误- x的返回类型错误

通常使用async时,最好使用Task.Run而不是StartNew。如果计划使用状态对象,则不能这样做。在这种情况下,您需要"修复"StartNew用法为:

bool stop = await Task<Task<bool>>.Factory.StartNew(Listen, client).Unwrap();

Listen的返回值是Task<bool>而不是bool,因此StartNew的返回类型需要是Task<Task<bool>>,您需要等待两次或使用UnwrapTask.Run是在async的基础上建立的,所以它为你做了这一切。