相关疑难解决方法(0)

嵌套调用异步函数如何工作?

我是异步编程的新手,我的问题可能看起来很傻.请问任何人,在下面的伪代码示例中解释异步调用是如何工作的?

    public async Task MyMethod()
    {
     while(true)
     {
      await Method1();
      //do something in MyMethod 
      await Task.Delay(10000);
     }
    }

    private async Task Method1()
    {
    //do something in Method1 before await
    await Method2();
    //do something in Method1 after await
    }

    private async Task Method2()
    {
    //do something in Method2 before await
    await LongRunMethod();
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,该程序的工作原理如下

  1. MyMethod()在无限循环中调用Method1()
  2. Method1()运行"在等待之前在Method1中执行某些操作"
  3. Method1()启动Method2()并将控制权返回给MyMethod()
  4. MyMethod()启动10000毫秒延迟并将控制权返回给其调用者
  5. Method2()完成"在await之前在Method2中执行某些操作",启动LongRunMethod()并将控制权返回给MyMethod1()
  6. Method1()完成"等待后在Method1中执行某些操作".之后有什么方法可以控制?
  7. LongRunMethod()完成了它的工作
  8. Method2()完成其工作.它是否将控制权返回给Method1()?
  9. 10000ms后,一切都从第1步开始重复.

我的问题是

  1. 以上步骤顺序是否正确?
  2. 在Method1()和Method2()完成第6步和第8步的工作后,有哪些方法可以控制?
  3. 如果LongRunMethod()运行时间超过10000毫秒会发生什么?

谢谢

c# asynchronous

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

如何指定Parallel.ForEach中执行的并行任务数?

我有~500个任务,每个任务需要约5秒,大部分时间浪费在等待远程资源回复上.我想定义应该自己生成的线程数(经过一些测试)并在这些线程上运行任务.当一个任务完成时,我想在可用的线程上生成另一个任务.

我发现System.Threading.Tasks最容易实现我想要的,但我认为不可能指定应该并行执行的任务数量.对于我的机器,它总是大约8(四核cpu).是否有可能以某种方式告诉应该并行执行多少任务?如果不是最简单的方法来实现我想要的东西?(我试过线程,但代码要复杂得多).我尝试增加MaxDegreeOfParallelism参数,但它只限制了最大数量,所以这里没有运气......

这是我目前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        private static List<string> _list = new List<string>();
        private static int _toProcess = 0;

        static void Main(string[] args)
        {   
            for (int i = 0; i < 1000; ++i)
            {
                _list.Add("parameter" + i);
            }

            var w = new Worker();
            var w2 = new StringAnalyzer();

            Parallel.ForEach(_list, new ParallelOptions() { MaxDegreeOfParallelism = 32 }, item =>
            {
                ++_toProcess;
                string data = …
Run Code Online (Sandbox Code Playgroud)

.net c# parallel-processing parallel.foreach

2
推荐指数
1
解决办法
963
查看次数