Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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#中优化时间触发Azure函数的性能?_C#_Asynchronous_Azure Functions_Task Parallel Library_Azure Function Async - Fatal编程技术网

如何在C#中优化时间触发Azure函数的性能?

如何在C#中优化时间触发Azure函数的性能?,c#,asynchronous,azure-functions,task-parallel-library,azure-function-async,C#,Asynchronous,Azure Functions,Task Parallel Library,Azure Function Async,我有一个每秒运行的时间触发Azure函数。该函数从API服务器读取数据并将其存储到ADL中。如何优化函数的性能,使其能够进行500次以上的API调用,并在一秒钟内存储每个调用的每秒数据 public static void Run([TimerTrigger("*/1 * * * * *")] TimerInfo myTimer, ILogger log) { log.LogInformation($"C# T

我有一个每秒运行的时间触发Azure函数。该函数从API服务器读取数据并将其存储到ADL中。如何优化函数的性能,使其能够进行500次以上的API调用,并在一秒钟内存储每个调用的每秒数据

        public static void Run([TimerTrigger("*/1 * * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");


            log.LogInformation($"Execution starts at: {DateTime.Now.ToString("hh.mm.ss.ffffff")}");

            try
            {
                var IDs = GetIDs(); //makes 1 API call to fetch list of IDs
                
                foreach(var i in IDs){
                   ReadAndWriteData(i); //reads data for each ID from API server and stores in ADLS
                }
            }
            catch (Exception e)
            {
                log.LogError($"An exception has been raised : {e}");
            }

            log.LogInformation($"C# Timer trigger function execution ended at: {DateTime.Now}");
        }
       
        public static async Task<List<string>> GetIDs(){
          //List<string> idList = await Task.Run(()=> ReadIDs()); //makes 1 API call to fetch list of IDs
          //return idList;
        }
       public static async Task ReadAndWriteData(String id){
           //var result = await Task.Run(()=> ReadData()); //reads data for each ID from API server
           ...
           // uploads data to ADLS 
       }

publicstaticvoidrun([TimerTrigger(***/1*****)]TimerInfo myTimer,ILogger log)
{
log.LogInformation($“C#计时器触发器函数在:{DateTime.Now}执行”);
log.LogInformation($”执行开始于:{DateTime.Now.ToString(“hh.mm.ss.ffffff”)});
尝试
{
var IDs=GetIDs();//进行1次API调用以获取ID列表
foreach(id中的var i){
ReadAndWriteData(i);//从API服务器读取每个ID的数据并存储在ADL中
}
}
捕获(例外e)
{
LogError($“引发了异常:{e}”);
}
log.LogInformation($“C#计时器触发器函数的执行在:{DateTime.Now}结束);
}
公共静态异步任务GetIDs(){
//List idList=wait Task.Run(()=>ReadIDs());//进行1次API调用以获取ID列表
//返回懒汉;
}
公共静态异步任务读写数据(字符串id){
//var result=wait Task.Run(()=>ReadData());//从API服务器读取每个ID的数据
...
//将数据上载到ADL
}

每秒准确获取所有ID数据的最佳方法是什么?我尝试过一些并行编程/TPL方法,但如果我只使用一个ID,而不是所有ID,它仍能提供预期的准确性。

首先,可能有许多问题会给您带来性能问题。您必须使用或任何其他工具进行调试,并检查哪行代码花费了多少时间

其中一些原因可能是:

  • 有一种低效的算法是为获取ID/ADL操作编写的
  • 您没有将
    .ConfigureAwait(false)
    await
    一起添加
  • 自动缩放
    未为
    Azure功能启用
    ,并且由于
    手动缩放不足
    而阻碍了缩放
  • 您正在使用大量的Nuget软件包,这些软件包需要花费大量时间来创建Azure函数的实例
  • 您尚未将
    readid
    ReadData
    功能设置为

  • 我不确定你有什么问题。ID和时间之间的关系是什么?虽然我也不明白您的实际问题是什么,但您的代码看起来是错误的。例如,
    varids=GetIDs()您正在对异步方法进行未等待的调用,然后尝试在foreach循环中使用结果。这不是那样的。嗨@Magnus,我需要每秒获取所有ID的数据。让我试着说得更清楚些。让我们忘记ID,并考虑我们必须调用**Read and Read DATA(i)**,其中我只是一个字符串列表,如{ 1”、“2”、“500”}。如果此列表有2,3个值,我将每秒获取数据,并将其上传到以下存储层次结构yyyy/mm/dd/H/M/S/file.json中的ADLS中。但对于500个值,我可以看到在每分钟的文件夹中,一秒钟只创建一个文件夹,而不是所有60秒。希望,这有助于理解问题。嘿,@singhh-msft。谢谢你的建议。1.虽然函数没有太多的优化空间。我还是会看一看的。2.添加了
    ConfigureAwait(false)
    和await,但没有太大区别。3.如何为Azure功能启用自动缩放?4.Energistics是我使用的唯一一个Nuget软件包,除了像NewtonSoft.Json这样的普通软件包,因为我使用的是WITSML数据。5.所有函数都是异步的。缩放:;5.函数定义应在返回类型中包含
    Task
    ,并包含
    async
    关键字。请确保这个在那里。关于休息点:好的在我的场景中,使用function app的消费计划应该会提高性能,对吗?因为它最多有200个实例。是否需要配置任何东西以确保使用max实例?这取决于您所提供的负载。