To improve performance you should definitely avoid calling Control.Invoke() within your loops. You could wrap your entire loop in a Control.Invoke() instead or, even better, create a list of items to display and then update your control in a single Control.Invoke() invocation. This would allow you to avoid performance hits if you implemented further filtering on items by performing them on the non-GUI thread.
Also, you shouldn't need the Application.DoEvents() call in there.
Here's an example of what I mean by creating a list of items and adding them to the control later:
var itemsToAdd = new List<ListViewItem>();
foreach (KeyValuePair<string, string> listItem in dct)
{
ListViewItem item = new ListViewItem(listItem.Key);
item.SubItems.Add(listItem.Value);
itemsToAdd.Add(item);
}
Invoke(new MethodInvoker(() =>
{
listview.Items.AddRange(itemsToAdd);
}));