[c#] 調用任何交叉線程代碼的最佳方法?


Answers

使用ISynchronizeInvoke而不是Control 。 這是Control使用Invoke/BeginInvoke/EndInvoke/InvokeRequired實現的接口。

另一種方法是使用SynchronizationContext.Current - 這是BackgroundWorker使用的,我相信。

Question

我知道之前已經問過這個問題,但我正在尋找一種方法:

  1. 簡化安全交叉線程代碼的創建。
  2. 在任何情況下都重用此代碼(沒有Windows窗體引用)。

這是我到目前為止,但我想刪除Windows窗體引用。 有任何想法嗎?

public delegate void SafeInvokeDelegate(System.Action action);
public class SafeInvoke
{
    private readonly System.Windows.Forms.Control _threadControl;

    public SafeInvoke()
    {
        _threadControl = new System.Windows.Forms.Control();
    }

    public void Invoke(System.Action action)
    {
        if (_threadControl.InvokeRequired)
            _threadControl.Invoke(new SafeInvokeDelegate(Invoke), new object[] {action});
        else if (action != null) action();
    }
}

上面的類可能會這樣使用:

SafeInvoke _safeInvoker = new SafeInvoke();
void SafeClearItems()
{
    _safeInvoker.Invoke(delegate
        {
            listView1.Items.Clear();
        });
}

我如何刪除SafeInvoke類中的System.Windows.Forms.Control但保持相同的功能?




現在有一天它很容易調用,例如說我們想調用一個Label(lblVal)來獲取txtVal的值

lblVal.invoke((MethodInvoker)delegate{txtVal.Text = lblVal.Text;});

就這麼簡單:D




Links



Tags

c# c#   .net .net   invoke