I'm having some trouble accessing the UI from an another thread. I understand the basics on cross-threading limitations, but I can't seem to write the code that will work. More specifically, I can't access the ListView from a static method (thread).
I'm trying to make it work with backgroundWorker.
Here's my code:
private void start_Click(object sender, EventArgs e)
{
    ServicePointManager.DefaultConnectionLimit = 20;
    var tasks = new List<Task<int>>();
    foreach (ListViewItem item in listView1.Items)
    {
        string currentUrl = item.SubItems[1].Text;
        int i = item.Index;
        tasks.Add(Task.Factory.StartNew(() => { return GetWebResponse(currentUrl, i); }));
    }
    Task.WaitAll(tasks.ToArray());
}
private static int GetWebResponse(string url, int itemIndex)
{
    int statusCode = 0;
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);           
    Task<HttpWebResponse> responseTask = Task.Factory.FromAsync<HttpWebResponse>(httpWebRequest.BeginGetResponse, asyncResult => (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult), null);
    backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.WorkerSupportsCancellation = true;
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
    backgroundWorker.RunWorkerAsync();
    return statusCode;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    listView1.Items[0].ImageKey = "green";
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    while (!e.Cancel)
    {
        Thread.Sleep(5000);
        backgroundWorker.ReportProgress(0);
    }
}
This code doesn't work because backgroundWorker_DoWork and backgroundWorker_ProgressChanged are not static, but if I make them static then I can't access listView1
EDIT: Got it working. Code below for review
public delegate void delUpdateListView(int itemIndex, int statusCode);
public Form1()
{
    InitializeComponent();
}
private void start_Click(object sender, EventArgs e)
{
    ServicePointManager.DefaultConnectionLimit = 20;
    var tasks = new List<Task<int>>();
    foreach (ListViewItem item in listView1.Items)
    {
        string currentUrl = item.SubItems[1].Text;
        int i = item.Index;
        tasks.Add(Task.Factory.StartNew(() => {
            //return GetWebResponse(currentUrl, i);
            int statusCode = 0;
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(currentUrl);
            Task<HttpWebResponse> responseTask = Task.Factory.FromAsync<HttpWebResponse>(httpWebRequest.BeginGetResponse, asyncResult => (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult), null);
            statusCode = (int)responseTask.Result.StatusCode;
            object[] invParams = new object[2];
            invParams[0] = i;
            invParams[1] = statusCode;
            if (InvokeRequired)
            {
                BeginInvoke(new delUpdateListView(UpdateListView), invParams);
            }
            else
            {
                Invoke(new delUpdateListView(UpdateListView), invParams);
            }
            return statusCode;
        }));
    }
    Task.WaitAll(tasks.ToArray());
}
public void UpdateListView(int itemIndex, int statusCode) {
    listView1.Items[itemIndex].ImageKey = "green";
}
 
    