Многопоточность для задержки в WinApp Form C # - PullRequest
1 голос
/ 24 ноября 2011

У меня проблема с этим кодом в C #:

main class {
var trick = new Object();
}
.......
public void AddTabWithCheck(List<Urls> url)
{

//Some Code 

foreach(Urls link in url){
     var thread = new System.Threading.Thread(p =>
        {
            lock (trick)
            {
                Action action = () =>
                {
                    addTab(link);
                };
                this.Invoke(action);
                if(link.Host == "google")
                    System.Threading.Thread.Sleep(5000);
            }
        });
        thread.Start(); }
}

У меня была проблема с задержкой по времени в форме winapp.

Я могу использовать спящий поток, в то время как (withDatetime) или аналогичный, потому что внутри WinAPP есть браузер WebControl, и я хотел бы добавить некоторую страницу в цикл с некоторым временем задержки без остановки интерфейса.Ни один из таймеров не является хорошим решением, потому что с ним трудно справиться в моей ситуации.

Поэтому пользователь предлагает мне использовать это решение (те, что с Thread).Я думал, что это работает без проблем , но только теперь я понимаю, что если я включу в свой цикл, он возьмет только последний элемент (цикла) и создаст все потоки X с одним и тем же элементом.

Для лучшего объяснения: у меня есть это List<Urls> url ;

с этим классом

public class Urls {
            public string Host { get; set; }
            public String url { get; set; }
}

Теперь я не могу понять, почему, если я добавляю этот код в простой Foreach, когда все потоки начинают использоватьпоследний элемент цикла.

Я уже проверил правильность списка, добавив MessageBox для отображения текущего объекта перед кодом потока, и он изменился правильно.

1 Ответ

2 голосов
/ 24 ноября 2011

Все ваши анонимные методы используют одну и ту же переменную link.

Вам необходимо объявить отдельную переменную внутри цикла, чтобы каждый метод получил свою собственную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...