Есть форма, которая делает api запрос через таймер. Мне нужно запустить несколько таких форм, чтобы они делали api запрос. Но при создании второй формы ничего не происходит. Как заставить работать их одновременно?
private void status_Click(object sender, EventArgs e)
{
Thread th2 = new Thread(new ThreadStart(createForm));
th2.Start();
}
public static void createForm()
{
new logForm("-1111111").ShowDialog();
}
Например так
В главной форме код такой
private void MenuItemNew_Click(object sender, EventArgs e)
{
var form = new FormChild();
form.MdiParent = this;
//запускаем таймер и запросы к API
form.Run();
//отображаем окно
form.Show();
}
В дочерней такой
public partial class FormChild : Form
{
private readonly TaskScheduler _uiScheduler;
private readonly HttpClient _httpClient;
public FormChild()
{
InitializeComponent();
//запоминаем синхр.контекст
_uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
//настройка клиента
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri("https://jsonplaceholder.typicode.com");
_httpClient.Timeout = new TimeSpan(0, 0, 30);
//настройка таймера
_timer.Interval = 2000;
_timer.Tick += Timer_Tick;
}
/// <summary>
/// Запуск Таймера
/// </summary>
public void Run()
{
_timer.Start();
}
/// <summary>
/// Тик таймера
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Timer_Tick(object sender, EventArgs e)
{
//запускаем запрос к сайту и отображение результатов
Task.Run(async () => await GetAnswer()).ContinueWith(t =>
{
_richTextBox.Text += t.Result;
}, _uiScheduler);
}
/// <summary>
/// Запрос к сайту API
/// </summary>
/// <returns></returns>
private async Task<string> GetAnswer()
{
string result = String.Empty;
var response = await _httpClient.GetAsync("posts/1");
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
result = BuildOutput(json);
}
else
{
result = response.StatusCode.ToString();
}
return result;
}
/// <summary>
/// Парсинг ответа
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
private string BuildOutput(string json)
{
dynamic blogPost = JObject.Parse(json);
var builder = new StringBuilder();
builder.AppendLine(new string('>', 45));
builder.AppendLine($"[{ DateTime.Now.ToLocalTime()}]");
builder.AppendLine($"Пользователь: {blogPost.userId}");
builder.AppendLine($"Заголовок:{blogPost.title}");
builder.AppendLine(new string('<', 45));
builder.AppendLine();
return builder.ToString();
}
}
Решение проекта целиком здесь.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть несколько девайсовПрограмма должно эти устройства постоянно пинговать
Всем доброго времени суток! Столкнулся я с такой вот проблемой: Есть необходимость при помощи C# Net20 рассчитать скорость видеокарты, так как...
Проблема с лямбда функцией, вроде написал сортировку вектора по остаткам по возрастанию, так, чтобы числа с одинаковыми остатками выводились...