Task.Delay在ASP.NET中可以安全使用吗?

时间:2016-05-18 07:23:32

标签: c# asp.net async-await

我的操作只返回带有信息的JSON字符串。

为防止用户编辑每2秒更新一次信息的JS代码,我还需要服务器端延迟来防止高CPU负载。

如果(例如)2000-5000用户同时执行相同的请求,使用Task.Delay(2000)的安全性如何?返回的信息因用户而异。

4 个答案:

答案 0 :(得分:2)

Task.Delay使用起来非常安全,因为它不涉及创建或阻止线程,或者它不会使CPU停滞。

另一方面,它无法帮助您,因为仍然可以从一台机器执行多个请求。延迟执行而不进一步检查是一种无用的方法来限制请求。

答案 1 :(得分:2)

为什么您认为添加Task.Delay(2000)会减少CPU负载?如果在T处有高CPU负载,则添加Task.Delay(2000)只会将高CPU负载推迟到T + 2,这是完全无助的。

快速解决方案是检查UI端的提交频率,就像在网页上一样,禁用提交按钮并在几秒钟后再次启用它。但这可能会被欺骗,因为可以修改前端脚本。

更安全的解决方案是检查服务器端的提交频率,在某处记录上次提交时间(例如静态变量,最简单),并拒绝无效请求。

答案 2 :(得分:1)

如果它是Task.Delay,那么是的,这很好。 Task.Delay导致一个带有计时器的任务,该任务在完成时将继续执行该任务(在计时器的回调中)。鉴于它的工作方式,它不会阻塞你的线程,也不会在另一个线程上执行,所以它似乎没问题。您发布的请求数量也不会很大。

但是,我的答案更多的是在ASP.NET MVC中使用Task.Delay而不是在特定场景中使用public static function resize($src_file, $dst_file, $dst_width = null, $dst_height = null, $file_type = 'jpg', $force_type = false, &$error = 0, &$tgt_width = null, &$tgt_height = null, $quality = 5, &$src_width = null, &$src_height = null) { if (PHP_VERSION_ID < 50300) { clearstatcache(); } else { clearstatcache(true, $src_file); } if (!file_exists($src_file) || !filesize($src_file)) { return !($error = self::ERROR_FILE_NOT_EXIST); } list($tmp_width, $tmp_height, $type) = getimagesize($src_file); $rotate = 0; if (function_exists('exif_read_data') && function_exists('mb_strtolower')) { $exif = @exif_read_data($src_file); if ($exif && isset($exif['Orientation'])) { switch ($exif['Orientation']) { case 3: $src_width = $tmp_width; $src_height = $tmp_height; $rotate = 180; break; case 6: $src_width = $tmp_height; $src_height = $tmp_width; $rotate = -90; break; case 8: $src_width = $tmp_height; $src_height = $tmp_width; $rotate = 90; break; default: $src_width = $tmp_width; $src_height = $tmp_height; } } else { $src_width = $tmp_width; $src_height = $tmp_height; } } else { $src_width = $tmp_width; $src_height = $tmp_height; } // If PS_IMAGE_QUALITY is activated, the generated image will be a PNG with .jpg as a file extension. // This allow for higher quality and for transparency. JPG source files will also benefit from a higher quality // because JPG reencoding by GD, even with max quality setting, degrades the image. if (Configuration::get('PS_IMAGE_QUALITY') == 'png_all' || (Configuration::get('PS_IMAGE_QUALITY') == 'png' && $type == IMAGETYPE_PNG) && !$force_type) { $file_type = 'png'; } if (!$src_width) { return !($error = self::ERROR_FILE_WIDTH); } if (!$dst_width) { $dst_width = $src_width; } if (!$dst_height) { $dst_height = $src_height; } $width_diff = $dst_width / $src_width; $height_diff = $dst_height / $src_height; $ps_image_generation_method = Configuration::get('PS_IMAGE_GENERATION_METHOD'); if ($width_diff > 1 && $height_diff > 1) { $next_width = $src_width; $next_height = $src_height; } else { if ($ps_image_generation_method == 2 || (!$ps_image_generation_method && $width_diff > $height_diff)) { $next_height = $dst_height; $next_width = round(($src_width * $next_height) / $src_height); $dst_width = (int)(!$ps_image_generation_method ? $dst_width : $next_width); } else { $next_width = $dst_width; $next_height = round($src_height * $dst_width / $src_width); $dst_height = (int)(!$ps_image_generation_method ? $dst_height : $next_height); } } if (!ImageManager::checkImageMemoryLimit($src_file)) { return !($error = self::ERROR_MEMORY_LIMIT); } $tgt_width = $dst_width; $tgt_height = $dst_height; $dest_image = imagecreatetruecolor($dst_width, $dst_height); // If image is a PNG and the output is PNG, fill with transparency. Else fill with white background. if ($file_type == 'png' && $type == IMAGETYPE_PNG) { imagealphablending($dest_image, false); imagesavealpha($dest_image, true); $transparent = imagecolorallocatealpha($dest_image, 255, 255, 255, 127); imagefilledrectangle($dest_image, 0, 0, $dst_width, $dst_height, $transparent); } else { $white = imagecolorallocate($dest_image, 255, 255, 255); imagefilledrectangle($dest_image, 0, 0, $dst_width, $dst_height, $white); } $src_image = ImageManager::create($type, $src_file); if ($rotate) { $src_image = imagerotate($src_image, $rotate, 0); } if ($dst_width >= $src_width && $dst_height >= $src_height) { imagecopyresized($dest_image, $src_image, (int)(($dst_width - $next_width) / 2), (int)(($dst_height - $next_height) / 2), 0, 0, $next_width, $next_height, $src_width, $src_height); } else { ImageManager::imagecopyresampled($dest_image, $src_image, (int)(($dst_width - $next_width) / 2), (int)(($dst_height - $next_height) / 2), 0, 0, $next_width, $next_height, $src_width, $src_height, $quality); } $write_file = ImageManager::write($file_type, $dest_image, $dst_file); @imagedestroy($src_image); return $write_file; } ,如果需要更具体的答案,则需要详细描述。

答案 3 :(得分:1)

如果用户使用asp.net会话,除了asp.net中正确的其他答案之外,还有一个问题,你必须知道,因为 asp.net会话锁定整个网站直到通话返回。

因此,如果您使用该延迟,使用会话,您将阻止所有用户...请阅读:

Does ASP.NET Web Forms prevent a double click submission?
Web app blocked while processing another web app on sharing same session
What perfmon counters are useful for identifying ASP.NET bottlenecks?
Replacing ASP.Net's session entirely
Trying to make Web Method Asynchronous