Sprockwatch прошло время иногда прыгает через секунды и не начинается сразуC#

Место общения программистов C#
Ответить
Anonymous
 Sprockwatch прошло время иногда прыгает через секунды и не начинается сразу

Сообщение Anonymous »

Описание вопроса
Я испытываю две основные проблемы при использовании Spectwatch для отслеживания времени в моем приложении.
[*] Задержка запуска < /strong>: Когда я нажимаю кнопку «Пуск», истешенное время занимает около 3-5 секунд, прежде чем он начнет считать, даже если Процесс подачи заявки уже работает. Полем Например, если секундомер достигает 00:00:25 , он иногда на мгновение замораживает, а затем прыгает прямо на 00:00:27 , пропуская секунду.

< /ol>
Что я попробовал < /strong> < /h3>
  • Я попытался немедленно заставить обновление пользовательского интерфейса , добавив задержку, но это не устранило первоначальные проблемы.
  • я пытался разные способы, чтобы обеспечить плавные обновления пользовательского интерфейса , но проблемы сохраняются.
В верхней части Form1 у меня есть следующий код:
private Stopwatch stopwatch = new Stopwatch();
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
< /code>
В конструкторе: < /p>
public Form1()
{
InitializeComponent();

LoadSettings();
InitializeTooltips();
lblWebpage.Select();
}
< /code>
Кнопка нажимает событие, которое запустило операцию, и истекшее время: < /pbr />private async void btnDownload_Click(object sender, EventArgs e)
{
SaveSettings();

InitElapsedTime(); // ✅ Start elapsed time immediately without using Task.Run

await Task.Delay(10); // ✅ Give the UI a chance to update before proceeding

string url = txtUrl.Text.Trim();
string startPattern = txtStartPattern.Text.Trim();
string endPattern = txtEndPattern.Text.Trim();
bool findAll = chkFindAll.Checked;
bool useRegex = chkUseRegex.Checked;
string regexPattern = cmbRegexPresets.SelectedIndex > 0 ? cmbRegexPresets.SelectedItem.ToString() : txtRegexPattern.Text.Trim();

if (string.IsNullOrEmpty(url) || (string.IsNullOrEmpty(startPattern) && !useRegex))
{
LogMessage("Error: Please fill in all fields.", Color.Red);
return;
}

LogMessage($"Downloading source from: {url}...", Color.Cyan);
progressBar.Value = 0;

try
{
using (HttpClient client = new HttpClient())
{
string pageSource = await client.GetStringAsync(url);
LogMessage("Download successful!", Color.Green);
progressBar.Value = 50;
await ExtractAndSaveResultsAsync(pageSource, startPattern, endPattern, findAll, useRegex, regexPattern);
}
}
catch (Exception ex)
{
LogMessage($"Error downloading source: {ex.Message}", Color.Red);
}
finally
{
stopwatch.Stop(); // ✅ Stop elapsed time when the process is finished
}
}
< /code>
Операция извлечения: < /p>
private async Task ExtractAndSaveResultsAsync(string source, string startPattern, string endPattern, bool findAll, bool useRegex, string regexPattern)
{
List extractedResults = await Task.Run(() => Extractor.Extract(source, startPattern, endPattern, findAll, useRegex, regexPattern));

if (extractedResults.Count == 0)
{
LogMessage("No matches found!", Color.Red);
}
else
{
int count = extractedResults.Count;
int processed = 0;

foreach (var result in extractedResults)
{
LogMessage($"Extracted: {result}", Color.LightGreen);

// ✅ Update progress live
processed++;

lblAmountExtractedCounter.Invoke(new Action(() =>
{
lblAmountExtractedCounter.Text = processed.ToString();
}));

progressBar.Invoke(new Action(() =>
{
progressBar.Value = (int)((processed / (float)count) * 100);
}));

await Task.Delay(1); // ✅ Prevents UI freezing
}
}

if (chkSaveResults.Checked)
{
await Task.Run(() => Exporter.SaveResults(extractedResults, txtSavePath.Text, chkSaveAsTxt.Checked, chkSaveAsCsv.Checked));
LogMessage("Results saved successfully!", Color.Green);
}

progressBar.Invoke(new Action(() =>
{
progressBar.Value = 100;
}));

// ✅ Final log message: extracted count and timestamp
LogMessage($"Extraction Complete: {extractedResults.Count} items found | {DateTime.Now:yyyy-MM-dd HH:mm:ss}", Color.Cyan);
}
< /code>
init в исходное время: < /p>
private void InitElapsedTime()
{
stopwatch.Reset(); // ✅ Reset stopwatch to start from zero
stopwatch.Start(); // ✅ Start counting elapsed time immediately

lblTime.Invoke(new Action(() => lblTime.Text = "00:00:00")); // ✅ Force UI update immediately
timer.Interval = 1000; // ✅ Set 1-second update interval
timer.Tick -= timer_Tick; // ✅ Remove previous event handlers (prevent multiple events)
timer.Tick += timer_Tick; // ✅ Attach new event
timer.Start();
}
< /code>
Timer Tick Event: < /p>
void timer_Tick(object sender, EventArgs e)
{
UpdateText();
}
< /code>
Метод обновления текста: < /p>
void UpdateText()
{
if (stopwatch.IsRunning)
{
TimeSpan elapsed = stopwatch.Elapsed;

lblTime.Invoke(new Action(() =>
{
lblTime.Text = string.Format("{0:D2}:{1:D2}:{2:D2}",
elapsed.Hours, elapsed.Minutes, elapsed.Seconds);
}));
}
}
< /code>
и последнее метод сообщения журнала: < /p>
private void LogMessage(string message, Color color)
{
if (this.IsDisposed || !this.IsHandleCreated) return; // ✅ Prevent error if form is closing
try
{
rtbLogger.Invoke(new Action(() =>
{
if (this.IsDisposed || !this.IsHandleCreated) return; // ✅ Extra check

rtbLogger.SelectionStart = rtbLogger.TextLength;
rtbLogger.SelectionLength = 0;
rtbLogger.SelectionColor = color;
rtbLogger.AppendText($"{DateTime.Now:HH:mm:ss} - {message}\n");
rtbLogger.SelectionColor = rtbLogger.ForeColor;
}));
}
catch (ObjectDisposedException) { /* ✅ Ignore if form is already closed */ }
catch (InvalidOperationException) { /* ✅ Ignore invalid UI access */ }
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... -immediate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»