相关疑难解决方法(0)

如何使用call/cc实现c#5.0中的新异步功能?

我一直在关注asyncc#5.0中新功能的新公告.我对继续传递样式以及新的c#编译器对Eric Lippert的帖子中的代码片段所做的转换有基本的了解:

async void ArchiveDocuments(List<Url> urls)
{
  Task archive = null;
  for(int i = 0; i < urls.Count; ++i)
  {
    var document = await FetchAsync(urls[i]);
    if (archive != null)
      await archive;
    archive = ArchiveAsync(document);
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道有些语言通过call-with-current-continuation(callcc)本地实现continuation ,但我真的不明白它是如何工作的或它究竟是做什么的.

所以这就是问题:如果安德斯等人.已经决定咬紧牙关,只是callcc在c#5.0而不是async/ await特殊情况下实现,上面的代码片段会是什么样子?

c# asynchronous callcc continuation-passing async-await

19
推荐指数
1
解决办法
2821
查看次数

从非异步方法调用异步方法

我尝试的以下代码的每个变体都不起作用 - 无论DoSomething() : void是被调用还是DoSomething() : Task被调用,或者被调用TaskEx.RunEx(),有些尝试涉及.GetAwaiter().GetResult().看到错误包括:"Start may not be called on a task with null action","RunSynchronously may not be called on a task unbound to a delegate",和"The task has not yet completed".

class Program
{
    static void Main(string[] args) // Starting from a non-async method
    {
        DoSomething();

        Console.WriteLine("Press any key to quit.");
        Console.ReadKey();
    }

    static async void DoSomething()
    {
        Console.WriteLine("Starting DoSomething ...");

        var x = …
Run Code Online (Sandbox Code Playgroud)

c# async-ctp

6
推荐指数
3
解决办法
1万
查看次数