Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么新任务<;对象>;((Func<;Task<;object>;)(async()=>;{})在新任务<;Foo>;(…)不工作时工作?_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 为什么新任务<;对象>;((Func<;Task<;object>;)(async()=>;{})在新任务<;Foo>;(…)不工作时工作?

C# 为什么新任务<;对象>;((Func<;Task<;object>;)(async()=>;{})在新任务<;Foo>;(…)不工作时工作?,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,为什么newtask((Func)(async()=>{})在newtask(…)不起作用时工作 这项工作: private static Task<object> Works( ) { return new Task<object>( ( Func<Task<object>> )( async ( ) => { return new object( ); } ), new CancellationTokenS

为什么
newtask((Func)(async()=>{})
newtask(…)
不起作用时工作

这项工作:

private static Task<object> Works( ) {
    return new Task<object>( ( Func<Task<object>> )( async ( ) => {
        return new object( );
    } ), new CancellationTokenSource( ).Token );
}
私有静态任务工作(){
返回新任务((Func)(异步()=>{
返回新对象();
}),新的CancellationTokenSource().Token);
}
但这并不是:

private static Task<Foo> Doesnt( ) {
    return new Task<Foo>( (Func<Task<Foo>>)(async ( ) =>{
        return new Foo( );
    } ), new CancellationTokenSource( ).Token );
}
私有静态任务不(){
返回新任务((Func)(异步()=>{
返回新的Foo();
}),新的CancellationTokenSource().Token);
}
将Foo替换为任何非对象的对象(或者我猜是任何其他原语),您将看到红色曲线上出现相同的错误消息:
与“System.Threading.Task.Task.Task(object,System.Threading.Tasks.TaskCreationOptions)”匹配的最佳重载方法具有一些无效参数

我甚至看到了它所指的重载方法……但为什么它认为我在使用
Func
时试图调用该方法,而在使用
Func
时却没有调用

这适用于对象(或对象),但在我的类中失败。我甚至用另一个类对象(窗口)尝试了它,但失败了

编辑 针对第一位不能编译的说法,我已经能够编译以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncFlubbery {
    class Program {

        private static Task<object> Works( ) {
            return new Task<object>( ( Func<Task<object>> )( async ( ) => {
                return new object( );
            } ), new CancellationTokenSource( ).Token );
        }

        static void Main( string[ ] args ) {
            Works( ).Start( );
            Console.WriteLine( "Press Enter To Begin..." );
            Console.ReadLine( );
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统线程;
使用System.Threading.Tasks;
命名空间异步错误{
班级计划{
私有静态任务工作(){
返回新任务((Func)(异步()=>{
返回新对象();
}),新的CancellationTokenSource().Token);
}
静态void Main(字符串[]参数){
工作(),开始();
Console.WriteLine(“按Enter开始…”);
Console.ReadLine();
}
}
}

这是一个简单的类型转换案例

它归结为以下代码:

Func<Task<object>> fto = null;
Func<object> fo = fto; //this is a fine cast

Func<Task<Foo>> ftf = null;
Func<Foo> ff = ftf; //this is **NOT** a fine cast
Func fto=null;
Func fo=fto;//这是一个很好的演员阵容
Func-ftf=null;
Func ff=ftf;//这不是一个好演员
由于
Task
是从
object
派生的,所以第一次强制转换是可以的

但是
Task
没有派生自
Foo
,因此强制转换无效


因此,即使第一个代码进行编译,它在运行时也不会像预期的那样工作。这两个代码位最终都是错误的。

这是类型转换的一个简单例子

它归结为以下代码:

Func<Task<object>> fto = null;
Func<object> fo = fto; //this is a fine cast

Func<Task<Foo>> ftf = null;
Func<Foo> ff = ftf; //this is **NOT** a fine cast
Func fto=null;
Func fo=fto;//这是一个很好的演员阵容
Func-ftf=null;
Func ff=ftf;//这不是一个好演员
由于
Task
是从
object
派生的,所以第一次强制转换是可以的

但是
Task
没有派生自
Foo
,因此强制转换无效


因此,即使第一个代码进行编译,它在运行时也不会像预期的那样工作。这两个代码位最终都是错误的。

那就是.Awesome.Please.Remove.Fluff。
任务
需要
Func
。因为
Func
协变(在.NET Framework 4+中)而
Task
object
您可以使用
Func
而不是
Func
Task
需要
Func
并且
Task
不是
Foo
,因此您不能使用
Func
而不是
Func
。问题中提供的代码无法编译,即使是第一个问题你说可以。你能确保你有一个新任务吗?你可以返回新任务使它编译,但我不知道它是否能满足你的需要。那就是。太棒了。请删除。Fluff。
Task
需要
Func
。因为
Func
协变(在.NET Framework 4+中)而
Task
object
您可以使用
Func
而不是
Func
Task
需要
Func
并且
Task
不是
Foo
,因此您不能使用
Func
而不是
Func
。问题中提供的代码无法编译,即使是第一个问题你说是的。你能确定你有一个新任务吗?你可以返回新任务使其编译,但我不知道它是否能满足你的需要。@Will-两段代码都有错误。第一段代码不是将
任务
展开到
对象
-它只是在强制转换。两件不同的事情。你需要从头开始重新编码。你在尝试什么如何处理此代码?@Will,解决问题的第一步是在一个新的单独问题中确定您试图解决的业务/逻辑问题。就这个具体问题而言,Enigmativity的答案是完整的……我有一个长期运行的初始化过程,我需要(有力地)支持取消负责此任务的任务。所需行为:程序检索此任务(不启动它),因为我需要监视任务的状态(已创建、已取消、已完成)。用户单击按钮:程序检查任务状态:已创建?任务。开始();否则不检查CancellationToken.IsCancellationRequested?Token。取消()否则:对用户大喊大叫。任务取消不是即时的;方法(和子方法)有几个地方可以调用Token.ThrowIfCancelation()(cont)…Token.ThrowIfCancellation()。如果程序检测到(按按钮时)任务仍在运行(因为Task.Status!=已创建Token.iscancellationrequest)这意味着它还没有命中ThrowIfCancellationRequested()中的一个调用。这意味着在任务到达其中一个调用之前,它不能再执行任何操作,否则我们将导致两列火车在同一轨道上运行,最终导致火车失事…程序将在取消完成后检索新任务(以及刷新CancellationTokenSource)。希望c