לדעתי הדרך הכי טובה זה להשתמש בשיטה האסינכרונית
לדוגמה
//פונקציה אסינכרונית
private async Task DoSomething()
{
label1.Text = "Before await";// זה ירוץ על ה UI Thread
await Task.Run(() =>
{
// פה תכניס את הקוד הכבד שלך
// זה ירוץ על Thread אחר
});
label1.Text = "After await";// זה ירוץ על ה UI Thread
}
בזמן שירוץ הTask ה-UIThread יהיה משוחרר
תאסוף את הנתונים בתוך הTask ותכניס את זה לפקדים אחרי הTask כשתחזור ל-UIThread
נ.ב. יש גם אפשרות לגשת ל-UIThread מתוך ה-Task או כל Thread אחר האינטרנט מלא בדוגמאות