// 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")
{ }
}
更新
回到这一点,在对线程并发进行概要分析之后,我发现我给出的同步上下文方法确实是错误的。不要使用它无用你打算稍微更改它以保证线程安全。
答案 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");