gpt4 book ai didi

c# - 类(class)之间的调度员

转载 作者:行者123 更新时间:2023-12-03 13:21:24 24 4
gpt4 key购买 nike

学习 C#、WPF。目前正试图掌握 Dispatchers,特别是在线程和其他类之间。

我让调度程序在“MainWindow”类中工作,但是当我将它按如下方式分离到另一个类中时,我收到编译错误消息“类型'System.Windows.Threading.Dispatcher'没有定义构造函数”

显然是一个基本的学习错误,但我无法弄清楚。下面的代码,请朝正确的方向插入:)

namespace threading_dispatcher_learn
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

public delegate void MyDel();

public MainWindow()
{
InitializeComponent();

label1.Content = "Label1";

this.label2.Content = this.Dispatcher.Thread.ManagedThreadId;


Myupdator updateclass = new Myupdator();


Thread MyNewThread;


MyNewThread = new Thread(updateclass.UpdateLabel);
MyNewThread.Start();


}



private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Clicked");
}

}

public class Myupdator
{

public void UpdateLabel()
{
MainWindow.MyDel del1 = delegate()
{

try
{
// label1.Content = "Update 2";
//Thread.Sleep(3000);
MessageBox.Show("Message 2");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
};

/* Now removed
Dispatcher myDispather = new Dispatcher();
myDispather.BeginInvoke(DispatcherPriority.Normal, del1);
*/
//now added
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, del1);
Dispatcher.CurrentDispatcher.InvokeShutdown();

}
}

}

更新 : 上面修改的代码,这是正确的方法吗?我对你的理解正确吗?尽管“del1”中没有任何内容被调用。

最佳答案

您不应该创建 Dispatcher使用构造函数实例化。访问 Dispatcher对于当前线程(如果不存在则创建一个新线程)只需获取 Dispatcher.CurrentDispatcher 的值.不要忘记在不再需要时关闭调度程序(例如使用 Dispatcher.InvokeShutdown )。

然而,你为什么要这样做?在绝大多数情况下,创建 Dispatcher是错误的做法。 Dispatcher为 Windows 消息循环建模,因此它仅对 UI 线程有意义。

更新:您似乎只是想修改标签的内容并显示一个对话框。 您不得创建新的 Dispatcher为此 ;相反,请使用 Dispatcher已经在您的 UI 线程上创建。您需要将 Dispatcher.CurrentDispatcher 的值传递给新线程从您的主线程中获取,或者您需要传递对任何 UI 控件(例如标签或窗口本身)的引用。

例如:

var mainWindow = ... ; // you need to pass this to your new thread somehow
mainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, del1);

让我再次重复经验法则:除非您在多线程应用程序方面有丰富的经验,否则创建一个新的 Dispatcher总是做错事。

关于c# - 类(class)之间的调度员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com