Одновременный запуск одной формы в приложении

170
20 марта 2022, 09:10

Есть форма, которая делает 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();
    }
Answer 1

Например так

В главной форме код такой

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();
    }
}

Решение проекта целиком здесь.

READ ALSO
TCPClient async/await C#

TCPClient async/await C#

У меня есть несколько девайсовПрограмма должно эти устройства постоянно пинговать

63
C# Узнать скорость вычесления на GPU (хешрейт)

C# Узнать скорость вычесления на GPU (хешрейт)

Всем доброго времени суток! Столкнулся я с такой вот проблемой: Есть необходимость при помощи C# Net20 рассчитать скорость видеокарты, так как...

97
Кастомный аллокатор

Кастомный аллокатор

Есть такой аллокатор:

68
Помогите с лямбда выражением для сортировки

Помогите с лямбда выражением для сортировки

Проблема с лямбда функцией, вроде написал сортировку вектора по остаткам по возрастанию, так, чтобы числа с одинаковыми остатками выводились...

104