Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# F#startimimediate的等价物_C#_F#_Async Await - Fatal编程技术网

C# F#startimimediate的等价物

C# F#startimimediate的等价物,c#,f#,async-await,C#,F#,Async Await,是否有一个C#等价于F#的startimimediate,可以在任务上执行?有时我需要等待函数,但有时我只希望该方法调用UI线程,而不使用wait 如果可能的话,我想避免异步void 例如: public async void DoSomething() { //before runs on UI thread await OtherThing(); //after runs on UI thread } public async Task DoSomethingEls

是否有一个C#等价于F#的
startimimediate
,可以在
任务上执行?有时我需要等待函数,但有时我只希望该方法调用UI线程,而不使用
wait

如果可能的话,我想避免异步void

例如:

public async void DoSomething()
{
    //before runs on UI thread
    await OtherThing();
    //after runs on UI thread
}

public async Task DoSomethingElse()
{
    //before runs on UI thread
    await OtherThing();
    //I want this to run on the UI thread
}

public void CallDoSomething()
{
    DoSomething(); //no need to await, returns to the UI thread to continue execution

    DoSomethingElse();//Doesn't return to the UI thread to continue execution

    DoSomethingElse().???(); // how to return to the UI thread for the async callback?
}
在F#中,这看起来像这样:

let CallDoSomething()=
//这里有更多代码
异步的{
//在当前线程上运行
做!其他事
//在当前线程上运行
}|>Async.startimimediate
//这里的代码不会等待异步完成

您是否尝试过Task类的RunSynchronously()方法?

因此,当查看您的代码示例时。您有一个
async
方法,该方法返回一个
任务
。您正在调用该方法,然后对结果任务调用
Start
(不调用
wait
)。这将在运行时引发异常。仅通过调用该方法,任务已启动。启动已经运行的任务(或已完成的任务,如果它在返回之前已完成)将引发异常。只能
启动
使用
任务
构造函数创建的任务,但不使用该构造函数

您还可以在注释中声明,在调用
DoSomethingElse
后返回时,您不在UI线程中。这是错误的。代码将在UI线程中运行

您还暗示
DoSomethingElse
中的
wait
不会将回调封送到UI线程,但它会。因为它是从UI线程调用的,所以它捕获了UI上下文,并在调用
wait
时使用它

因此,简而言之,除了删除对
Start
的调用之外,您不需要做任何事情

如果你这样构造你的代码,你确实有一个问题,那就是你永远不会知道你的代码是否出错,因为没有什么可以观察到任何异常。有两种方法可以解决这个问题。一个是你在这个庄园中调用的每一个方法都认为自己是“顶级方法”,并且处理所有异常,而不是每次抛出任何异常。
另一个选项是存储以这种方式调用的所有任务,并
等待任务。当所有这些任务都
完成时,您可以观察到任何错误。

您不太清楚您的意思。如果你能给出一个具体的例子,那将非常有帮助。如果你想
等待
某个条件得到满足,那么你所需要做的就是编写
如果(条件)等待任务然而,如果这是你真正想做的,我不认为你会问这个问题,那么我不明白什么?@JonSkeet这有点澄清问题吗?不太清楚。什么是
CallDoSomething
调用源?“返回到UI线程”是什么意思?“不返回UI线程”是什么意思?为什么您试图对异步方法返回的任务调用
Start()
?@JonSkeet请参阅Servy的答案以获得澄清。我希望它异步运行,但不会停止当前方法的执行。对不起,我误解了您的问题:(如果你想去掉否定的代表,你可以删除你的答案。是的,我在
Start()方面做得太草率了。)
.Ah,那么即使没有等待,任务也会在其原始线程上下文中继续?是的。:-P责怪android。顶级事件有返回值,因此您无法进行正确的异步调用。您必须创建新级别的顶级事件。我想与iOS共享此代码并赢得8,因此新的“顶级”事件仍然需要返回
Task
@mydogisbox在原始线程上不继续的唯一方法是
wait
,而是使用
configurewaitfalse
。当前执行的线程只是调用一个方法。在本例中,该方法返回一个值,即任务。当线程被设置为执行一个具有其中有两个方法,它不会在第一个子方法之后停止执行。它除了去执行下一个子方法之外,没有其他地方可以去。啊,出于某种原因,我认为任务将在一个新的
线程上执行。谢谢!@mydogisbox只有当你显式调用某个东西来创建一个新线程时,才会创建一个新线程。通常情况下s将通过调用
任务来完成。运行
。没有它,除了UI线程之外就没有其他线程。