Я вычисление простых чисел м.т. два чисел, используя следующий кодКак я могу постоянно обновлять свой ListBox синхронно
private static IEnumerable<int> GetPrimes(int from, int to)
{
for (int i = from; i <= to; i++)
{
bool isPrime = true;
int limit = (int)Math.Sqrt(i);
for (int j = 2; j <= limit; j++)
if (i % j == 0)
{
isPrime = false;
break;
}
if (isPrime)
{
yield return i;
}
}
}
И я хочу, чтобы обновить окно списка без блокировки моего UI нити, все простые числа, используя выше код. Согласие, которое я использую как следующее, но это не работает.
public MainWindow()
{
InitializeComponent();
_worker = new BackgroundWorker();
_worker.DoWork += _worker_DoWork;
this.DataContext = this;
}
private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
PrimeNumbers = new ObservableCollection<int>();
foreach (var item in GetPrimes(1, 10000000))
{
Dispatcher.BeginInvoke(new Action<int>(Test), item);
}
}
private void Test(int obj)
{
PrimeNumbers.Add(obj);
}
public ObservableCollection<int> PrimeNumbers
{
get
{
return primeNumbers;
}
set
{
primeNumbers = value;
OnPropertyChanged("PrimeNumbers");
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
_worker.RunWorkerAsync();
}
но этот подход замораживает мой интерфейс. Я хочу, чтобы иметь результат непрерывно идущий от метода GetPrimes и продолжайте добавлять к моему listboz
Вы можете просто выполнить всю работу над рабочим потоком, а затем выполнить команду Invoke() в элементе управления со всей обновленной информацией. Или вы можете сделать то же самое с кодом, который у вас есть, так как вы хотите регулярно его обновлять, сначала получите все номера, а затем выполните begininvoke, а не делайте это для каждого номера, – SomeNickName
Простой. Вы обновляете пользовательский интерфейс очень часто. Количество работ, выполненных в рабочей нити, сравнительно меньше, чем то, что делает поток пользовательского интерфейса. Вы можете обновить все сразу или сделать это в пакете. –
@SriramSakthivel Большое спасибо. Вы помогли мне добраться до решения, которое я стану ответом – Vikram