Затем с помощью reindex
в качестве защиты
pd.DataFrame(dic).reindex(index=['value','attr','param'])
Out[553]:
common fuzzy adhead
value 18 14 13
attr 20 21 20
param 22 24 29
Вы также могли использовать дополнительный метод и лямбды для создания кода намного более чистым.
using System.ComponentModel;
public static class ISynchronizeInvokeExtensions
{
public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke
{
if (@this.InvokeRequired)
{
@this.Invoke(action, new object[] { @this });
}
else
{
action(@this);
}
}
}
Таким образом, теперь можно использовать InvokeEx
на любом ISynchronizeInvoke и смочь получить доступ к свойствам и полям класса с реализацией.
this.InvokeEx(f => f.listView1.Items.Clear());
Использовать ISynchronizeInvoke
вместо Control
. Это - интерфейс это Control
реализации с Invoke/BeginInvoke/EndInvoke/InvokeRequired
.
Альтернатива должна использовать SynchronizationContext.Current
- который является что BackgroundWorker
использование, я верю.