c# - 将异步任务切换为同步任务

标签 c# asynchronous

我有以下代码:

Task.Factory.ContinueWhenAll(items.Select(p =>
{
    return CreateItem(p);
}).ToArray(), completedTasks => { Console.WriteLine("completed"); });

是否可以将 ContinueWhenAll 转换为同步方法?我想在异步和同步之间切换回来。

编辑:我应该注意到 continuewhenall 方法中的每个“任务”都应该同步执行。

最佳答案

如果您想完整保留现有代码并有同步执行的可变选项,您应该进行以下更改:

bool isAsync = false; // some flag to check for async operation

var batch = Task.Factory.ContinueWhenAll(items.Select(p =>
{
    return CreateItem(p);
}).ToArray(), completedTasks => { Console.WriteLine("completed"); });

if (!isAsync)
    batch.Wait();

这样您就可以通过编程方式切换它,而不是通过编辑您的源代码。您可以使两种方法的延续代码保持相同。

编辑:

这是一个简单的模式,用于将相同的方法表示为同步和异步版本:

public Item CreateItem(string name)
{
    return new Item(name);
}

public Task<Item> CreateItemAsync(string name)
{
    return Task.Factory.StartNew(() => CreateItem(name));
}

关于c# - 将异步任务切换为同步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456900/

相关文章:

typescript - TS2322 : Type  'File'  is not assignable to type  'typeof File'

javascript - 在这个 javascript 的异步示例中,为什么第二个函数不运行?

JavaScript 异步编程 : promises vs generators

c# - 生成进程,但一次只有 5 个

c# - Cambria Math 大的顶部和底部边距

c# - 确定方法参数的上下文

c# - 从 PHP (MySQL) 中选择返回 Android (C#)

c# - 我在控制台应用程序中吗?

c# - 从列名中获取数据类型

c++ - 何时在 async 或 packaged_task 上使用 promise?