当前位置:  开发笔记 > 编程语言 > 正文

等待新任务<T>(...):任务不运行?

如何解决《等待新任务<T>():任务不运行?》经验,为你挑选了2个好方法。

这里问的一个问题的延续:

在上述问题中,我有以下函数返回Task类型的对象(用于增量测试目的):

private static Task GetInstance( ) {
    return new Task( (Func>)(async ( ) => {
        await SimpleMessage.ShowAsync( "TEST" );
        return new object( );
    } ) );
}


当我调用时await GetInstance( );,函数被调用(我假设任务被返回,因为没有抛出异常),但随后任务就在那里.

我只能猜测我做错了.

我不希望此函数返回已在运行的任务(即IMPERATIVE).

如何异步运行此函数返回的任务?



1> Joanvo..:

创建任务已经开始

尝试创建这样的任务:

Task.Factory.StartNew((Func>) ...);


在不启动任务的情况下创建任务

如果您不希望任务启动,只需new Task(...)按原样使用,但是Start()在等待它之前需要调用该任务的方法!

[参考]

我的推荐

只需创建一个返回匿名函数的方法,如下所示:

private static Func GetFunction( ) {
    return (Func)(( ) => {
        SimpleMessage.Show( "TEST" );
        return new object( );
    } );
}


然后得到它并在Task需要时以新的方式运行它(还要注意我async/await从lambda表达式中删除了它,因为你已将它放入一个Task中):

Task.Factory.StartNew(GetFunction());


这样做的一个优点是你也可以调用它而不将它放入Task:

GetFunction()();


鉴于我所处理的情况的复杂性,这个问题超出了考虑的范围(TL; DR:我做错了).但是,您的答案是创建任务并在不启动任务的情况下返回任务的正确方法.

2> usr..:

你在那里遇到了糟糕的设计.在这些限制条件下,我会尝试让一些东西适合你.

延迟启动任务的唯一方法是使用该Task.Start方法.(你也可以使用,RunSynchronously但它并没有真正利用任何任务功能.此时任务变成一个无线的懒惰对象.

所以使用Task.Start方法.

await不启动任务.它等待已经运行的任务.因此await new Task(() => { })总是永远冻结.

另一个问题是:

return new Task( (Func>)(async ( ) => {
    await SimpleMessage.ShowAsync( "TEST" );
    return new object( );
} ) );


当你启动该任务时,它几乎会立即完成,Task.Result并将执行另一项任务 - 异步lambda返回的任务.我怀疑这是你想要的.很难做到这一点,我不知道你需要什么.

这有点像XY问题.你能详细说明你想要完成的事情吗?感觉就像你给了自己不必要的限制.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有