Обновление пользовательского интерфейса было в моем случае просто очистить метки (см. UpdateInterface ()). Однако я обнаружил «ошибку». Это был файл ".jpg" и BackgroundImage, который я загружал при каждом обновлении. Хотя это было «просто» 1280x1024, это было слишком много для обновления интерфейса.
Когда я очистил изображения, обновление было немедленно.
Мое решение теперь:
this.BackgroundImage = ((System.Drawing.Image(resources.GetObject("$this.BackgroundImage")));
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);
в Form1.Designer.cs
и Приостановка и возобновление макета со следующим классом (который я нашел где-то в Интернете) [ 117]
public static class ControlHelper
{
#region Redraw Suspend/Resume
[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SETREDRAW = 0xB;
public static void SuspendDrawing(this Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}
public static void ResumeDrawing(this Control target) { ResumeDrawing(target, true); }
public static void ResumeDrawing(this Control target, bool redraw)
{
SendMessage(target.Handle, WM_SETREDRAW, 1, 0);
if (redraw)
{
target.Refresh();
}
}
#endregion
}
Также я изменил файлы ".jpg" на файлы ".bmp". Теперь интерфейс гладкий и быстрый.
И @Jesting:
Не уверен, что это на самом деле: this.BackgroundImage = BackgroundWelcome; но действительно ли необходимо назначать такие статические данные каждый раз?
blockquote>Нет, я мог бы найти лучшее решение. Однако, поскольку приложение очень маленькое, и у меня есть только четыре фоновых изображения, мне было проще «жестко закодировать» его.
Наконец, тег (-reader) на самом деле не был проблемой.
А для обновления пользовательского интерфейса я использую эту довольно простую функцию:
private void UpdateInterface(PassportDatabaseReader.Passport _passport) { if (InvokeRequired) { this.BeginInvoke(new Action<PassportDatabaseReader.Passport>(UpdateInterface), new object[] { _passport }); return; } else { ControlHelper.SuspendDrawing(this); new Thread(() => ChangeBackground(BackgroundPassport)).Start(); lPassportNumberNo.Text = _passport.PassportNo; strPassportNo = _passport.PassportNo; lPassengerName.Text = _passport.Name.Replace('
Приложение представляет собой считыватель «свадебного паспорта», который показывает имя, номер комнаты гостей, номер стола, а также изображение "паспорта" на экране.
,'\n'); lPax.Text = _passport.Pax; lTableNo.Text = _passport.TableNo; lRoomNo.Text = _passport.RoomNo; pbTables.Hide(); try { pbPasspic.Load("..\\..\\Pics\\" + _passport.PassportNo + ".png"); pbPasspic.Show(); pbTables.ImageLocation = "..\\..\\Tischordnung_" + _passport.TableNo + ".png"; pbTables.Show(); } catch (Exception) { throw; } ControlHelper.ResumeDrawing(this); } }Приложение представляет собой считыватель «свадебного паспорта», который показывает имя, номер комнаты гостей, номер стола, а также изображение "паспорта" на экране.
Да, using
переносит Ваш код в блок попытки/наконец, где finally
часть будет звонить Dispose()
, если это будет существовать. Это не будет, однако, звонить Close()
непосредственно, поскольку это только проверяет на IDisposable
реализовываемый интерфейс и следовательно Dispose()
метод.
См. также:
Это - то, как отражатель декодирует IL, сгенерированный Вашим кодом:
private static void Main(string[] args) { SqlConnection conn = new SqlConnection("..."); try { conn.Open(); DoStuff(); } finally { if (conn != null) { conn.Dispose(); } } }
, Таким образом, ответ да, он закроет соединение, если
DoStuff()выдаст исключение.