Wil*_*ill 10 c# asynchronous task async-await
这里问的一个问题的延续:
在上述问题中,我有以下函数返回Task类型的对象(用于增量测试目的):
private static Task<object> GetInstance( ) {
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
}
Run Code Online (Sandbox Code Playgroud)
当我调用时await GetInstance( );
,函数被调用(我假设任务被返回,因为没有抛出异常),但随后任务就在那里.
我只能猜测我做错了.
我不希望此函数返回已在运行的任务(即IMPERATIVE).
如何异步运行此函数返回的任务?
创建任务已经开始
尝试创建这样的任务:
Task.Factory.StartNew<object>((Func<Task<object>>) ...);
Run Code Online (Sandbox Code Playgroud)
在不启动任务的情况下创建任务
如果您不希望任务启动,只需new Task<object>(...)
按原样使用,但是Start()
在等待它之前需要调用该任务的方法!
我的推荐
只需创建一个返回匿名函数的方法,如下所示:
private static Func<object> GetFunction( ) {
return (Func<object>)(( ) => {
SimpleMessage.Show( "TEST" );
return new object( );
} );
}
Run Code Online (Sandbox Code Playgroud)
然后得到它并在Task
需要时以新的方式运行它(还要注意我async/await
从lambda表达式中删除了它,因为你已将它放入一个Task中):
Task.Factory.StartNew<object>(GetFunction());
Run Code Online (Sandbox Code Playgroud)
这样做的一个优点是你也可以调用它而不将它放入Task
:
GetFunction()();
Run Code Online (Sandbox Code Playgroud)
您永远不应该使用Task
构造函数(或Task.Start
)。
我不希望此函数返回已在运行的任务(即 IMPERATIVE )。
那么,您想返回一些在您调用之前不会执行的代码吗?那是一个委托,而不是一个Task
.
private static Func<Task<object>> GetInstance()
{
return async () =>
{
await SimpleMessage.ShowAsync("TEST");
return new object();
};
}
Run Code Online (Sandbox Code Playgroud)
当您准备好执行它时,就像任何其他委托一样调用它。请注意,它返回 a 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
Run Code Online (Sandbox Code Playgroud)
你在那里遇到了糟糕的设计.在这些限制条件下,我会尝试让一些东西适合你.
延迟启动任务的唯一方法是使用该Task.Start
方法.(你也可以使用,RunSynchronously
但它并没有真正利用任何任务功能.此时任务变成一个无线的懒惰对象.
所以使用Task.Start
方法.
await
不启动任务.它等待已经运行的任务.因此await new Task(() => { })
总是永远冻结.
另一个问题是:
return new Task<object>( (Func<Task<object>>)(async ( ) => {
await SimpleMessage.ShowAsync( "TEST" );
return new object( );
} ) );
Run Code Online (Sandbox Code Playgroud)
当你启动该任务时,它几乎会立即完成,Task.Result
并将执行另一项任务 - 异步lambda返回的任务.我怀疑这是你想要的.很难做到这一点,我不知道你需要什么.
这有点像XY问题.你能详细说明你想要完成的事情吗?感觉就像你给了自己不必要的限制.