从函数返回值并启动任务

时间:2012-07-05 20:52:05

标签: c# multitasking

是否可以拥有这样的功能

public string Foo()
{
    Task.Factory.StartNew(Foo2());
    return "computedUniqueId";
}

问题是我想开始Foo2任务AFTER Foo返回一个值。我问这个的原因是Foo()函数的调用者将使用“computedUniqueId”监听信息。 Foo2()将触发该信息,因此可能存在一种情况,即侦听器不会等待什么并且将错过该消息。 总结一下: 有什么东西(比如continueWith)会断言Foo()在Foo2()开始之前返回它的值吗?

2 个答案:

答案 0 :(得分:1)

这是不可能的,因为return是该方法中发生的最后一件事。在return之后,所讨论的方法已将控制和范围放回给调用者。期。我能想到的最好的就是你从字符串“computerUniqueId”返回的地方调用Foo2。

也许如果您提供更多详细信息,我们可以提供更多帮助。感谢。

答案 1 :(得分:0)

  

有什么东西(比如continueWith)会断言Foo()在Foo2()开始之前返回它的值吗?

没有。问题是你无法控制等式的收听方。如果听众提前知道唯一ID很重要,我会将其分成两部分,并将唯一标识符传递给任务本身:

public string GenerateFooId()
{ 
    return "computedUniqueId";
}
public void Foo(string id)
{
    Task.Factory.StartNew(Foo2(id));
}

这样,您始终可以保证调用者在启动任务之前知道ID(因为调用者必须正确提供ID)。使ID成为自定义类型可以为您提供更多的安全性和控制,因为除了GenerateFooId之外的任何内容都无法生成此ID。