Gif w PictureBox nie animuje się ładnie

0

Mam pewną formatkę, w której dzieje się długi proces. Na czas, gdy się dzieje, chciałabym zasłonić wszystkie kontrolki animowanym kółeczkiem.

Kółeczko włożyłam w PictureBox, które ma Dock = Fill. Długi proces dzieje się natomiast w BackgroundWorkerze.

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
	ShowLoader();
	_results = LongProcess();
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
	LoadResultsToListView();
	HideLoader();
}

Pokazywanie i chowanie jest zrobione w następujący sposób:

private void ShowLoader()
{
	SetLoaderVisibility(true);
}

private void HideLoader()
{
	SetLoaderVisibility(false);
}

private void SetLoaderVisibility(bool value)
{
	loaderImage.InvokeIfRequired(x => x.Visible = value);

	otherControl.InvokeIfRequired(x => x.Visible = !value);
}

I sam extension:

public static class ControlExtensions
{
	public static void InvokeIfRequired<T>(this T control, Action<T> action) where T : ISynchronizeInvoke
	{
		if (control.InvokeRequired)
		{
			control.Invoke(new Action(() => action(control)), null);
		}
		else
		{
			action(control);
		}
	}
}    

Ok, kod pokazany, to teraz do sedna. Kółeczko się kręci, ale brzydko, bo skokowo. Wygląda mi z resztą na to, że póki wykonuje się makro po stronie Worda (odpalane w LongProcess()), to kółeczko skacze, a jak przechodzi do odpytywania po HTTP (drugi etap LongProcess()), to zaczyna się kręcić ładnie i płynnie...

Czy macie jakieś podpowiedzi, co można zrobić, by kółeczko było ładne od początku? Czy pozostaje mi tylko przeklinać Worda?

0
  1. A czy Worda uruchamiasz jako nowy proces? Czy jakoś go obsługujesz w wątku?
  2. Próbowałaś zamiast BackgroundWorkera użyć wątku albo async-await?
0

Ad. 1. No tak, oczywiście zapomniałam napisać o najważniejszym - projekt to VSTO Add-in a kontrolki znajduje się na TaskPanie Worda...
Aktywny proces Worda pobieram tak:

(Application)Marshal.GetActiveObject("Word.Application");

Ad. 2. Próbowałam jako Task, ale wyglądało to w zasadzie tak samo.

0

To wg mnie to kwestia Worda. Ale to nie jest oficjalna wypowiedź ;)

0

Czy LongProcess() synchronizuje się z często z głównym wątkiem, odpala jakieś Invoke? Być może robi to sam Word w jakiś sposób, powodując przycinanie się głównego wątku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1