这是在c#中动态调用的最佳方式吗?

时间:2015-12-02 05:35:28

标签: c#

    // Something that might need to be invoked
    private void MightnInvoke()
    {
       // Invoke if we need to.
      if (this.InvokeRequired) this.Invoke(new Action(this.MightnInvoke));

        // Do stuff here.             

    }

这是在c#中动态调用某些内容的最佳方式吗?

基本上我试图避免使用额外的代码块而不需要它们。

或者使用同步上下文更好吗?

 public void SyncContext(object state)
        {
            try
            {
                int id = Thread.CurrentThread.ManagedThreadId;
                Console.Writeline("Run thread: " + id);

                SynchronizationContext CommandContext = state as SynchronizationContext;

                   // Do stuff here and then use the CommandContext.
                    var Somestate = "Connected";
                    CommandContext.Send(Sometask, Somestate.ToString());              

                    Thread.Sleep(250);

            }
            catch (System.ComponentModel.InvalidAsynchronousStateException)
            {

            } 

  public void Sometask(object state)
        {
               // We can work in here and be on the same thread we came from.

            string Target = state as string;

            if (Target == "Connected")
            { }

        }

更新

回到这一点,在对线程并发进行概要分析之后,我发现我给出的同步上下文方法确实是错误的。不要使用它无用你打算稍微更改它以保证线程安全。

1 个答案:

答案 0 :(得分:0)

SynchronizationContext的官方MSDN文档中,它说;
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

这会让我相信你的实现可能不是线程安全的(虽然如果它正在工作,那么我可能会误解某些东西)。

就个人而言,它看起来有点像我的喜好。

我在制作中使用以下内容,从未遇到过线程问题。

public delegate void ActionCallback();
public static void AsyncUpdate(this Control ctrl, ActionCallback action)
{
    if (ctrl != null && (ctrl.IsHandleCreated && !ctrl.IsDisposed && !ctrl.Disposing))
    {
        if (!ctrl.IsHandleCreated)
            ctrl.CreateControl();

        AsyncInvoke(ctrl, action);
    }
}

private static void AsyncInvoke(Control ctrl, ActionCallback action)
{
    if (ctrl.InvokeRequired)
        ctrl.BeginInvoke(action);
    else action();
}

使用如下;

myTextBox.AsyncUpdate(() => myTextBox.Text = "Test");