【问题标题】:How run async method multiple times in separate threads?如何在不同的线程中多次运行异步方法?
【发布时间】:2016-02-18 20:20:52
【问题描述】:

我是使用 await/async 和 windows phone 8.1 编程的新手。我需要在多个线程中模拟运行异步方法。可能是四个,因为我的手机有四个核心。但我想不通:-(

这是我的异步方法的示例。

public async Task GetFilesAsyncExample(StorageFolder root)
{
        IReadOnlyList<StorageFolder> folders = await root.GetFoldersAsync(); 
        //DO SOME WORK WITH FOLDERS//
}

使用信号量对象可以确保四个线程,但我如何在同时运行的线程中运行它?

编辑: 这是我的代码,它探索文件夹结构并将有关文件的元数据记录到数据库中。我想通过在每个文件夹的单独线程中模拟地调用方法“async LogFilesFromFolderToDB(StorageFolder folder)”来加速此代码的执行。

 Stack<StorageFolder> foldersStack = new Stack<StorageFolder>();
            foldersStack.Push(root);
            while (foldersStack.Count > 0)
            {
                StorageFolder currentFolder = foldersStack.Pop();
                await LogFilesFromFolderToDB(null, currentFolder);// Every call of this method can be done in  a separate thread.
                IReadOnlyList<StorageFolder> folders = await currentFolder.GetFoldersAsync();
                for (int i = 0; i < folders.Count; i++)
                    foldersStack.Push(folders[i]);
            }

方法:async LogFilesFromFolderToDB(StorageFolder folder) 看起来像:

   async Task LogFilesFromFolderToDB(StorageFolder folder)
    {
        IReadOnlyList<StorageFile> files = await folder.GetFilesAsync();
        //SOME ANOTHER CODE//
    }

【问题讨论】:

  • 你想做什么以及为什么要同时运行它?
  • 你可以使用 ,Parallel.ForEach(folders, (currentFolder) => { /// 你的代码 })

标签: c# multithreading asynchronous windows-phone-8.1 windows-rt


【解决方案1】:

Parallel.Foreach 可以帮助解决这个问题。

试试下面的代码,

 public async Task GetFilesAsyncExample(StorageFolder root)
    {
        IReadOnlyList<StorageFolder> folders = await root.GetFoldersAsync();

        Parallel.ForEach(folders, (currentFolder) =>
        {
            Console.WriteLine("folder name:" + currentFolder.Name + " Files count" + currentFolder.GetFiles().Count());
        });
        //DO SOME WORK WITH FOLDERS//
    }

【讨论】:

  • 我认为这对我没有帮助。我需要调用类似方法 GetFilesAsyncExample() 而不是遍历文件夹集合。
  • 在这里,当您使用 Parallel 时,它将根据您机器中的可用内核同时运行您的代码。请关注 MSDN for Parallel.Foreach
猜你喜欢
  • 2013-04-21
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多