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# 任务在C中非法?_C#_Multithreading_Task - Fatal编程技术网

C# 任务在C中非法?

C# 任务在C中非法?,c#,multithreading,task,C#,Multithreading,Task,这段代码给出了VS2015中的编译时错误 错误CS0266无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Threading.Tasks.Task”。存在显式转换。是否缺少强制转换 更新1:建议使用任务后的扩展代码,而不是任务 int i = 0; Task<int> test = Task.Run( () => { return i; } );

这段代码给出了VS2015中的编译时错误

错误CS0266无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Threading.Tasks.Task”。存在显式转换。是否缺少强制转换

更新1:建议使用任务后的扩展代码,而不是任务

        int i = 0;

        Task<int> test = Task.Run( () => {
            return i;
        } );

        i = test.Result;

        Task t = Task.Run( () => { } );

        Task<Task> test2 = Task.Run( () => {
            return t;
        } );

        t = test2.Result;
任务是很常见的,如果我们错误地等待或等待错误的外部任务,这通常是一个问题:

在你的情况下,你想要

  Task test2 = Task.Run(() => {
    return t;
  });
由于Task.Run调用为您展开,因此任务非常常见,如果我们错误地等待错误的外部任务,则通常会出现问题:

在你的情况下,你想要

  Task test2 = Task.Run(() => {
    return t;
  });

由于Task.Run为您调用Unwrap

这是一种非常常见的方法,但使用Task.Run执行一些非同步操作,如果使用较旧的方法StartNew,它将执行您期望的操作,即调度线程池线程以启动异步操作,并告诉您异步操作何时完成启动

然而,这根本不是人们真正想要的。他们想知道Task.RUn中调用的异步操作何时完成。因此,Task.Run将打开将返回的任何任务,因此您真正看到的是innerTask`


如果您确实只想让一个线程池线程启动任务,并且只想知道任务何时完成启动,那么您可以使用task.Factory.StartNew,它不会代表您打开任务。

这是一种非常常见的方法,但可以使用task.Run执行一些非同步操作,如果使用旧的StartNew方法,它将实现您期望的功能,即调度线程池线程来启动异步操作,并告诉您异步操作何时完成启动

然而,这根本不是人们真正想要的。他们想知道Task.RUn中调用的异步操作何时完成。因此,Task.Run将打开将返回的任何任务,因此您真正看到的是innerTask`


如果您真的只想让一个线程池线程启动任务,并且只想知道它何时完成启动,那么您可以使用task.Factory.StartNew,它不会代表您打开任务。

一个简单的解决方案,不需要太多细节:

有效的准则是:

int i = 0;
Task<int> test = Task.Run(() =>
{
    return i;
});
Task t = Task.Run(() => { });
Task test2 = Task.Run(() =>
{
    return t;
});
根据你的更新3


我用睡眠来模仿你的长时间操作。我希望您不一定要使用Task。这应该给你足够的推力来攻击你的场景。通过将这两个操作设置为两个不同的线程,并将结果从一个线程传递到另一个线程,等待所需的一个线程并运行,而不等待另一个线程运行更长的任务,您可以进一步改进它以获得准确的结果。也就是说,从主方法调用两个方法,一个等待,另一个不等待。

一个简单的解决方案,不需要太多细节:

有效的准则是:

int i = 0;
Task<int> test = Task.Run(() =>
{
    return i;
});
Task t = Task.Run(() => { });
Task test2 = Task.Run(() =>
{
    return t;
});
根据你的更新3


我用睡眠来模仿你的长时间操作。我希望您不一定要使用Task。这应该给你足够的推力来攻击你的场景。通过将这两个操作设置为两个不同的线程,并将结果从一个线程传递到另一个线程,等待所需的一个线程并运行,而不等待另一个线程运行更长的任务,您可以进一步改进它以获得准确的结果。也就是说,从主方法调用两个方法,一个是等待的,另一个不是。

这是可行的,但给出了一个警告:warning CS1998此异步方法缺少'wait'运算符,将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务…Run…”在后台线程上执行CPU绑定的工作。我不想添加抑制杂注。@Anton Duzenko:只需声明Task test2=Task.Run=>{return t;};而Task.Run将隐式调用Unwrap for youTask test2将在t=test2.Result上给出错误@Anton Duzenko:Internal Task t不返回任何内容,这就是为什么test2.Result outer和unwrapped也不返回的原因。这是可行的,但给出了一个警告:warning CS1998此异步方法缺少“wait”运算符,将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务…Run…”在后台线程上执行CPU绑定的工作。我不想添加抑制杂注。@Anton Duzenko:只需声明Task test2=Task.Run=>{return t;};而Task.Run将隐式调用Unwrap for youTask test2将在t=test2.Result上给出错误@安东·杜曾科:内部任务不会返回任何东西,这就是为什么test2。结果outer和unwrapped也不会返回。你是想说这是非法的,因为大多数人都太愚蠢而不能正确使用它吗?你能用Task.Factory发布工作代码吗?@AntonDuzenko我不是说这是非法的,我是说这个任务。为你运行展开任务,因为大多数调用Task.Run的人都希望它能被展开。使用返回任务的方法运行。

因为这是大多数人真正想要得到的,这就是它所做的。所以我用return wait Task.Factory.StartNew做了它,但是可以用更少的措辞来做吗?@AntonDuzenko当然,你没有理由去做你一开始真正要求的任何事情。将这两个长操作包装在对Task.Run的调用中,然后等待它们。然后您就完成了StartAndReturnSecondTaskAsync根本不需要存在,StartAndReturnSecondTask实际上是异步的,而不是返回一个任务,而是同步完成它的一半工作,而它根本没有理由这样做。@AntonDuzenko您可以删除,如果你真的关心删除字符,你是想说这是非法的,因为大多数人都太蠢了,不能正确使用它吗?你能用Task.Factory发布工作代码吗?@AntonDuzenko我不是说这是非法的,我是说这个任务。为你运行展开任务,因为大多数调用Task.Run的人都希望它能被展开。使用返回任务的方法运行。因为这是大多数人真正想要得到的,这就是它所做的。所以我用return wait Task.Factory.StartNew做了它,但是可以用更少的措辞来做吗?@AntonDuzenko当然,你没有理由去做你一开始真正要求的任何事情。将这两个长操作包装在对Task.Run的调用中,然后等待它们。然后您就完成了StartAndReturnSecondTaskAsync根本不需要存在,StartAndReturnSecondTask实际上是异步的,而不是返回一个任务,而是同步完成它的一半工作,而它根本没有理由这样做。@AntonDuzenko您可以删除,如果您真的关心删除字符,请参阅更新1@AntonDuzenko您注意到Task test2=Task.Run Task test2=Task.Run的区别了吗。但是更新3有点不同,让我看看。wait StartAndReturnSecondTaskAsync无效,不返回任务。尝试以下操作:Task second=await start和return secondtask async。我收到错误CS0030无法将类型“void”转换为“System.Threading.Tasks.Task”请参阅更新1@AntonDuzenko您注意到Task test2=Task.Run Task test2=Task.Run的区别了吗。但是更新3有点不同,让我看看。wait StartAndReturnSecondTaskAsync无效,不返回任务。尝试以下操作:Task second=await start和return secondtask async。我收到错误CS0030无法将类型“void”转换为“System.Threading.Tasks.Task”是否确实要执行任务?你打算用它做什么?@Stephen Cleary请看更新3。这并不能解释为什么你需要任务而不仅仅是任务。我需要等待第一个任务,然后返回第二个任务one@PetSertAl错误CS0266无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Threading.Tasks.Task”。存在显式转换是否缺少强制转换?是否确实要执行此任务?你打算用它做什么?@Stephen Cleary请看更新3。这并不能解释为什么你需要任务而不仅仅是任务。我需要等待第一个任务,然后返回第二个任务one@PetSertAl错误CS0266无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Threading.Tasks.Task”。存在显式转换。是否缺少强制转换?
  Task test2 = Task.Run(() => {
    return t;
  });
int i = 0;
Task<int> test = Task.Run(() =>
{
    return i;
});
Task t = Task.Run(() => { });
Task test2 = Task.Run(() =>
{
    return t;
});
public async Task DoesTheThreadedOperations()
{
// Your code in question and other code
}
public static async Task StartAndReturnSecondTaskAsync()
{
    await Task.Run(() =>
    {
        return StartAndReturnSecondTask();
    });
}

public static Task StartAndReturnSecondTask()
{
    System.Threading.Thread.Sleep(5000);
    return Task.Run(() =>
    {
        System.Threading.Thread.Sleep(10000);
    });
}