Оставьте адрес почты, чтобы получить ответ.
Десять «машин» устраивают гонку, но, к сожалению, условия получаются не очень честные, и некоторые стартуют раньше других. Исправьте это.
class Program
{
static void Main(string[] args)
{
var runs = Enumerable.Range(0, 10)
.Select(x => new Car())
.Select(c => c.Race())
.ToArray();
Task.WhenAll(runs);
}
}
public class Car
{
public async Task Race()
{
var rnd = new Random();
var time = rnd.Next(10000) + 1;
await Task.Delay(TimeSpan.FromMilliseconds(time));
Console.WriteLine($"raced in {time} ms!");
}
}
У вас есть простейший aspnet core 2.1 веб-сервис, который на любой запрос возвращает текст RFC3339. Вы планируете хостить его на одной ubuntu 18.04 виртуальной машине и выдавать 200 rps. К сожалению, в нем есть проблема, вам предстоит ее исправить.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
using (var client = new HttpClient {BaseAddress = new Uri("https://www.ietf.org/")})
{
var result = await client.GetAsync("rfc/rfc3339.txt");
await context.Response.WriteAsync(await result.Content.ReadAsStringAsync());
}
await next();
});
}
Вам достался Asp.NET WebAPI сервис, в котором одна ручка, и она дедлочит на каждый запрос. Поправьте строку #5, чтобы это исправить.
public static async Task GetJsonAsync(Uri uri)
{
using (var client = new HttpClient())
{
var jsonString = await client.GetStringAsync(uri);
return JObject.Parse(jsonString);
}
}
public class MyController : ApiController
{
public string Get()
{
var jsonTask = GetJsonAsync(...);
return jsonTask.Result.ToString();
}
}
По наследству вам досталась MSSQL база ,в которой много бизнеслогики написано в хранимых процедурах. Одна из них — [dbo].[AwesomeGet] — принимает на вход табличный параметр с одной колонкой ID int. База находится на последнем издыхании, и вам нужно минимизировать нагрузку на нее. Какой вариант вызова процедуры из кода вы выберете и почему?
A
using (var con = new SqlConnection("STRINGHERE"))
{
using (var command = new SqlCommand("[dbo].[AwesomeGet]", con))
{
var dataTable = new DataTable();
//fill data here
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@IDs", dataTable);
//query and read
}
}
Б
using (var con = new SqlConnection("STRINGHERE"))
{
var sql = $@"declare @tmp IDList
insert into IDList values ({data.ToSqlString()})
exec dbo.AwesomeGet @tmp";
using (var command = new SqlCommand(sql, con))
{
var dataTable = new DataTable();
//fill data here
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@IDs", dataTable);
//query and read
}
}
В вашем интернет-магазине можно оплатить часть цены заказа баллами. Баллы снимают цену 1:1 к рублю и могут иметь копейки. Нужно распределить эти баллы по товарам в заказе так, чтобы на каждую позицию приходилось число баллов в копейках, кратное количеству товара в позиции, и чтобы при этом баллы распределялись пропорционально стоимости позиций. Если удовлетворить этим условиям не получается, то эксепшн надо выбросить.
Например, в заказе 3 ручки общей стоимостью 1 рубль, количество баллов 1. Распределить 100 копеек на три ручки невозможно, следовательно это эксепшн. Другой пример: в заказе 1 телевизор за 10 000 рублей и 2 рулона бумаги по 1000 рублей каждая, итого 12 баллов. На телевизор придется 10 баллов, на каждый рулон по 1 баллу.
Реализуйте интерфейс IDiscounter.
public class OrderItem
{
public int Id { get; set; }
public int Quantity { get; set; }
// цена за всю позицию = цена за товар * Quantity
public decimal PriceSum { get; set; }
public decimal PointsDiscount { get; set; }
}
public interface IDiscounter
{
// возвращает словарь в котором int это айди товара а decimal сколько баллов приходится на единицу товара
Dictionary SpreadDiscount(OrderItem[] items, decimal points)
}
Оставьте адрес почты, чтобы получить ответ.