gcm3206021155665
gcm3206021155665
采纳率0%
2018-03-01 08:06 阅读 5.5k

C#多线程处理实现post并发请求

10

需求是这样:如从文件中读取了10条数据,将数据参数循环给post请求,然后分别记录每个请求所用时间,最后记录平均请求时间,希望能从原有代码上使用多线程处理。请求和响应。
原有代码:
//读取excel
ds = Extensions.FilesIO.ExcelRead(file_path, "sheet1");
for (int i = 0; i < 5; i++)
{
id = ds.Tables[0].Rows[i][0].ToString().Trim();
name = ds.Tables[0].Rows[i][1].ToString().Trim();

            //请求参数
            var par = new Dictionary<string, string>();
            par.Add("name", name);
            par.Add("id", id);

            //测试demo
            result = Extensions.Http_Conn.SendPost(url, par, "get");
           记录当前请求时间
        }
        记录平均时间
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2018-03-01 15:26
    点赞 评论 复制链接分享
  • oLaoGong1234567 oLaoGong1234567 2018-03-03 03:08

    async Task post()
    {
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    var client = new HttpClient();
    await client.GetStringAsync("https://www.baidu.com");
    stopwatch.Stop();
    return stopwatch.ElapsedMilliseconds;
    }
    public async Task Exec()
    {
    Task[] tasks = new Task[10];
    for (int i = 0; i < 10; i++)
    {
    tasks[i] = post();
    }
    await Task.WhenAll(tasks);
    return tasks.Select(x => x.Result).ToArray();
    }

    点赞 1 评论 复制链接分享
  • oLaoGong1234567 oLaoGong1234567 2018-03-03 03:09
        async Task<long> post()
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            var client = new HttpClient();
            await client.GetStringAsync("https://www.baidu.com");
            stopwatch.Stop();
            return stopwatch.ElapsedMilliseconds;
        }
        public async Task<long[]> Exec()
        {
            Task<long>[] tasks = new Task<long>[10];
            for (int i = 0; i < 10; i++)
            {
                tasks[i] = post();
            }
            await Task.WhenAll(tasks);
            return tasks.Select(x => x.Result).ToArray();
        }
    
    点赞 评论 复制链接分享
  • xialxl xialxl 2018-03-09 01:06

    // 下面是我把文件夹中多个文件进行多线程的处理方法,包括了文件只应该被一个线程来处理,加锁的方法。你是文件中的数据所以这个功能,自己可以去了。
    private static Dictionary __RetryLocker = new Dictionary(128);
    private static object __LockDicLocker = new object();

        private static object GetLocker(string fileKey)
        {
            if (!__RetryLocker.TryGetValue(fileKey, out Object lockObj))
            {
                lock (__LockDicLocker)
                {
                    if (__RetryLocker.ContainsKey(fileKey))
                    {
                        lockObj = __RetryLocker[fileKey];
                    }
                    else
                    {
                        lockObj = new object();
                        __RetryLocker.Add(fileKey, lockObj);
                    }
                }
            }
            return lockObj;
        }
    
        private static void RemoveLocker(string fileKey)
        {
            lock (__LockDicLocker)
            {
                __RetryLocker.Remove(fileKey);
            }
        }
    
                // 线种中要执行的方法
        private static void Retry(string messageFile)
        {
            if (!File.Exists(messageFile))
            {
                return;
            }
            string fileKey = Security.MD5Encode(messageFile.ToLower());
            object lockObj = GetLocker(fileKey);
            lock (lockObj)
            {
                if (File.Exists(messageFile))
                {
                    SBMessage message = XmlSerializer.DeserializeFromFile<SBMessage>(messageFile);
                                        // 一个远程请求,可以修改为任务要执行的功能。其中可以包括请求时间的记录,可以将请求时间记录到静态变量中。自行处理
                    MessagePublisher.Publish(message, msg =>
                    {
                        RemoveLocker(fileKey);
                        File.Delete(messageFile);
                    });
                }
                else
                {
                    RemoveLocker(fileKey);
                }
            }
        }
        public static void Retry()
        {
            string[] files = Directory.GetFiles(MsgCacheFolder, "*.xml");
    
            if (files != null && files.Length > 0)
            {
                int lastCount = files.Length;
                int page = 20; // 最大线程数量
                List<Task> taskList = new List<Task>(lastCount > page ? page : lastCount);
                for (int i = 0; i < files.Length; i++)
                {
                    string tfn = files[i];
                    Task task = new Task(() =>
                    {
                        string rfn = tfn;
                        Retry(rfn);
                    });
                    task.Start();
                    taskList.Add(task);
                    lastCount = files.Length - i - 1;
                    if (taskList.Count >= page || lastCount == 0)
                    {
                        try
                        {
                            Task.WaitAll(taskList.ToArray());
                        }
                        catch (Exception ex)
                        {
                            MessagePublisher.Log(LogType.Exception, ex.ToString());
                        }
                        taskList = new List<Task>(lastCount > page ? page : lastCount);
                    }
                }
                taskList = null;
            }
        }
    
    点赞 评论 复制链接分享

相关推荐