Если вы хотите проверить экземпляры, запустите этот фрагмент кода и посмотрите на вывод:
import static java.lang.System.identityHashCode;
public class Program {
public static void main(String... args) {
String x = new String("xyz");
String y = "abc";
String z = x + y;
System.out.printf("x: %d | %d\n", identityHashCode(x), identityHashCode(x.intern()));
System.out.printf("y: %d | %d\n", identityHashCode(y), identityHashCode(y.intern()));
System.out.printf("z: %d | %d\n", identityHashCode(z), identityHashCode(z.intern()));
}
}
У меня есть следующий вывод, используя jdk1.7.0_67 :
x: 414853995 | 1719175803
y: 1405489012 | 1405489012
z: 1881191331 | 1881191331
Это всего 4 String
экземпляров ...
Вы блокируете поток графического интерфейса пользователя, что препятствует его обновлению. Вы можете вызвать lblStatus.Refresh () или переместить ожидание в фоновый поток (что в конечном итоге является правильным решением).
Это проблема с потоками. Вы можете сделать это в отдельных потоках или в фоновом потоке. Один из подходов, который я видел, - это Application.DoEvents (), хотя я обычно избегаю этого вызова.
Обновление графического интерфейса пользователя не может произойти, пока вы не завершите обработку в потоке переднего плана и не отпустите его. Вам необходимо выполнить восстановление в фоновом потоке, чтобы позволить потоку переднего плана продолжить обновление графического интерфейса. Рассмотрите возможность помещения кода восстановления в отдельный метод и использования ThreadPool.QueueUserWorkItem () и передачи метода восстановления. Это запустит ваш метод восстановления в потоке пула потоков.
Если вам нужен больший контроль над потоком и уведомление о его завершении, вы можете использовать BackgroundWorker