等待新任务<T>( ... ):任务没有运行?
Await new Task<T>( ... ) : Task does not run?
here 问题的延续:
在上述问题中,我有以下函数,其中 return 是一个任务类型的对象(用于增量测试目的):
private static Task<object> GetInstance( ) {
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
}
当我调用 await GetInstance( );
时,该函数被调用(并且我假设任务是 returned,因为没有抛出异常)但是任务就在那里。
我只能猜测我当时做错了。
我不希望此功能 return 一个 已经 运行ning 的任务(那个是 命令式[=31=]).
如何异步运行任务return由这个函数编辑?
创建一个已经开始的任务
尝试像这样创建任务:
Task.Factory.StartNew<object>((Func<Task<object>>) ...);
创建任务而不启动它
如果您不想启动该任务,只需像您使用的那样使用 new Task<object>(...)
,但是您需要在等待该任务之前调用该任务的 Start()
方法!
我的推荐
只需要创建一个returns匿名函数的方法,像这样:
private static Func<object> GetFunction( ) {
return (Func<object>)(( ) => {
SimpleMessage.Show( "TEST" );
return new object( );
} );
}
然后获取它,并在需要时将其 运行 放入新的 Task
中(另请注意,我从 lambda 表达式中删除了 async/await
,因为您将其放入已经有一个任务):
Task.Factory.StartNew<object>(GetFunction());
这样做的一个好处是您也可以调用它而无需将其放入 Task
:
GetFunction()();
好的,我想我已经弄明白了。请检查此代码:
class Program
{
public static void Main(string[] args)
{
// Only RUN the task as needed. FooGet
// still allows you to generalize your task.
Task.Run(() =>
{
dynamic value = FooGet();
value.RunSynchronously();
Console.WriteLine(value.Result.Result.ToString());
});
while (true) Thread.Sleep(100);
}
private static Task<object> FooGet()
{
var task = new Task<object>(() => {
return asyncBar();
});
return task;
}
private async static Task<object> asyncBar()
{
// do work!
return "Hello, world!";
}
}
你被一个糟糕的设计困住了。在这些限制条件下,我会尝试为您做一些工作。
延迟启动任务的唯一方法是使用Task.Start
方法。 (您也可以使用 RunSynchronously
但这并没有真正利用任何任务功能。此时任务变成了一个无线程的惰性对象。
所以使用Task.Start
方法。
await
不启动任务。它等待已经 运行 的任务。因此await new Task(() => { })
总是永远冻结。
这里还有一个问题:
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
当您启动该任务时,它将几乎立即完成,并且 Task.Result
将执行另一项任务 - 由异步 lambda 返回的任务。我怀疑这是你想要的。很难做到这一点,我不知道你需要什么。
这有点像 XY 问题。你能详细说明你想要完成什么吗?感觉给了自己不必要的束缚
永远不要使用 Task
构造函数(或 Task.Start
)。
I do not want this function to return a task that is already running ( that is IMPERATIVE ).
所以,您想要 return 一些在您调用之前不会执行的代码?那是代表,不是 Task
.
private static Func<Task<object>> GetInstance()
{
return async () =>
{
await SimpleMessage.ShowAsync("TEST");
return new object();
};
}
当您准备好执行它时,就像调用任何其他委托一样调用它。请注意,它 return 是 Task
,因此您可以 await
结果:
var func = GetInstance();
// Delegate has not started executing yet
var task = func();
// Delegate has started executing
var result = await task;
// Delegate is done
here 问题的延续:
在上述问题中,我有以下函数,其中 return 是一个任务类型的对象(用于增量测试目的):
private static Task<object> GetInstance( ) {
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
}
当我调用 await GetInstance( );
时,该函数被调用(并且我假设任务是 returned,因为没有抛出异常)但是任务就在那里。
我只能猜测我当时做错了。
我不希望此功能 return 一个 已经 运行ning 的任务(那个是 命令式[=31=]).
如何异步运行任务return由这个函数编辑?
创建一个已经开始的任务
尝试像这样创建任务:
Task.Factory.StartNew<object>((Func<Task<object>>) ...);
创建任务而不启动它
如果您不想启动该任务,只需像您使用的那样使用 new Task<object>(...)
,但是您需要在等待该任务之前调用该任务的 Start()
方法!
我的推荐
只需要创建一个returns匿名函数的方法,像这样:
private static Func<object> GetFunction( ) {
return (Func<object>)(( ) => {
SimpleMessage.Show( "TEST" );
return new object( );
} );
}
然后获取它,并在需要时将其 运行 放入新的 Task
中(另请注意,我从 lambda 表达式中删除了 async/await
,因为您将其放入已经有一个任务):
Task.Factory.StartNew<object>(GetFunction());
这样做的一个好处是您也可以调用它而无需将其放入 Task
:
GetFunction()();
好的,我想我已经弄明白了。请检查此代码:
class Program
{
public static void Main(string[] args)
{
// Only RUN the task as needed. FooGet
// still allows you to generalize your task.
Task.Run(() =>
{
dynamic value = FooGet();
value.RunSynchronously();
Console.WriteLine(value.Result.Result.ToString());
});
while (true) Thread.Sleep(100);
}
private static Task<object> FooGet()
{
var task = new Task<object>(() => {
return asyncBar();
});
return task;
}
private async static Task<object> asyncBar()
{
// do work!
return "Hello, world!";
}
}
你被一个糟糕的设计困住了。在这些限制条件下,我会尝试为您做一些工作。
延迟启动任务的唯一方法是使用Task.Start
方法。 (您也可以使用 RunSynchronously
但这并没有真正利用任何任务功能。此时任务变成了一个无线程的惰性对象。
所以使用Task.Start
方法。
await
不启动任务。它等待已经 运行 的任务。因此await new Task(() => { })
总是永远冻结。
这里还有一个问题:
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
当您启动该任务时,它将几乎立即完成,并且 Task.Result
将执行另一项任务 - 由异步 lambda 返回的任务。我怀疑这是你想要的。很难做到这一点,我不知道你需要什么。
这有点像 XY 问题。你能详细说明你想要完成什么吗?感觉给了自己不必要的束缚
永远不要使用 Task
构造函数(或 Task.Start
)。
I do not want this function to return a task that is already running ( that is IMPERATIVE ).
所以,您想要 return 一些在您调用之前不会执行的代码?那是代表,不是 Task
.
private static Func<Task<object>> GetInstance()
{
return async () =>
{
await SimpleMessage.ShowAsync("TEST");
return new object();
};
}
当您准备好执行它时,就像调用任何其他委托一样调用它。请注意,它 return 是 Task
,因此您可以 await
结果:
var func = GetInstance();
// Delegate has not started executing yet
var task = func();
// Delegate has started executing
var result = await task;
// Delegate is done