我有一个WPF应用程序,其中一个线程检查一些值.在某些情况下,我会显示一个弹出窗口Window以显示消息.当我在线程中创建此弹出窗口时,弹出窗口的构造函数抛出异常:
"调用线程必须是STA,因为许多UI组件都需要这个."
我该如何解决这个错误?
这是我创建弹出窗口的代码:
// using System.Threading;
// using System.Windows.Threading;
Thread Messagethread = new Thread(new ThreadStart(delegate()
{
DispatcherOperation DispacherOP =
frmMassenger.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(delegate()
{
frmMassenger.Show();
}));
}));
Messagethread.Start();
Run Code Online (Sandbox Code Playgroud) 我最初在serverfault.com上发布了一个与此问题相关的问题:https://serverfault.com/questions/152587/apache-mod-proxy-to-another-server
我已经意识到这不是我的服务器设置问题,而是我的rails应用程序.我已经在服务器上设置了这个应用程序,就像我在同一台服务器上运行的另一个正常运行的rails应用程序一样.当我启动服务器时,我的mongrel.log看起来像这样:
** Daemonized, any open files are closed. Look at /var/www/osuwebdev/tmp/pids/mongrel.pid and log/mongrel.log for info.
** Starting Mongrel listening at 0.0.0.0:8080
** Starting Rails with production environment...
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart).
** Rails signals registered. HUP => reload (without restart). It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:8080
** Writing PID file to /var/www/osuwebdev/tmp/pids/mongrel.pid …Run Code Online (Sandbox Code Playgroud) 有人可以告诉我何时使用a Dispatcher以及何时使用该SynchronizationContext课程?
有一段时间我一直在使用Dispatcher从后台线程排队任务,然后我发现了SynchronizationContext.
在WPF 4.5应用程序中,我不明白为什么在使用await + a task时UI被阻止:
private async void Button_Click(object sender, RoutedEventArgs e)
{
// Task.Delay works great
//await Task.Delay(5000);
double value = await JobAsync(25.0);
MessageBox.Show("finished : " + value.ToString());
}
private async Task<double> JobAsync(double value)
{
for (int i = 0; i < 30000000; i++)
value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75)));
return value;
}
Run Code Online (Sandbox Code Playgroud)
等待Task.Delay工作得很好,但等待JobAsync阻止了UI.为什么?谢谢.
在 WPF 中,所有控件都继承 DispatcherObject,并且可以轻松访问 Dispatcher。
如何使用 WinUI 3 Windows App SDK 获取 DispatcherQueue 并在 ViewModel 中使用它?
编辑
我的实现扩展了 mm8 最受赞赏的答案。
在我的 ViewModel 中创建一个属性
public Microsoft.UI.Dispatching.DispatcherQueue TheDispatcher { get; set; }
然后在我的 MainPage.xaml.cs 代码隐藏中获取调度程序Constructor
ViewModel.TheDispatcher = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
现在我的虚拟机中有调度程序,因此可以轻松地从虚拟机使用它:
TheDispatcher.TryEnqueue(() =>
{
// some ui thread work
});
Run Code Online (Sandbox Code Playgroud)
注意:我没有将此作为答案发布,因为有一个答案,这是我的实现,旨在帮助任何感兴趣的人。
我得到"此代码的非静态字段,方法或属性'System.Windows.Threading.Dispatcher.BeginInvoke(System.Action)'"需要对象引用.
private void ResponseCompleted(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
Dispatcher.BeginInvoke( () => {
try
{
XDocument resultsXml = XDocument.Load(sr);
QueryCompleted(new QueryCompletedEventArgs(resultsXml));
}
catch (XmlException e)
{
XDocument errorXml = new XDocument(new XElement("error", e.Message));
QueryCompleted(new QueryCompletedEventArgs(errorXml));
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在我的本地Ampps服务器上安装了Impresspages.当我继续打开它时,我收到错误消息:
错误
Fatal error: Call to undefined function Ip\ctype_digit() in /Applications/AMPPS/www/impresspage/Ip/Dispatcher.php on line 197
Run Code Online (Sandbox Code Playgroud)
这是Dispatcher.php的第197行:
if (ctype_digit($priority)) {
Run Code Online (Sandbox Code Playgroud)
我该怎么解决这个问题?
我有相当数量的Apache Camel(路由/调解/编排引擎;轻量级ESB)经验,并试图了解Akka之间的区别:
Dispatcher,PinnedDispatcher,CallingThreadDispatcher)根据文件:
调度员是:
...是让Akka演员"打勾"的原因,它可以说是机器的引擎.
但这并没有真正解释调度员是什么或与演员的关系是什么.
路由器是:
消息可以通过路由器发送,以有效地将它们路由到目标参与者,称为路由器.路由器可以在actor的内部或外部使用,您可以自己管理路由或使用具有配置功能的自包含路由器actor.但这听起来很像调度员.
游泳池是:
[一种]路由器[that]创建路由器作为子actor,如果它们终止则将它们从路由器中删除.
团体是:
[类型] actor [路由]在路由器外部创建,路由器使用actor选择将消息发送到指定路径,而不监视终止.
活动巴士是:
...向演员组发送消息的方法
这听起来就像调度员和路由器.
所以我的主要关注点是:
如果Dispatcher挂起(Dispatcher.DisableProcessing()调用),则尝试显示消息框时会引发异常.
InvalidOperationException:'Dispatcher processing has a suspended'(参见此处).
有谁知道我怎么能检测到Dispatcher暂停的地方(所以我知道什么时候打电话BeginInvoke())?
编辑1:
为了响应Application.DispatcherUnhandledException事件,我试图显示一个MessageBox.但是,如果在DataBinding(即ItemsControl.ItemsSource)期间抛出此未处理的异常,Dispatcher则会暂停.试图显示MessageBox然后失败.总是使用Dispatcher.BeginInvoke()解决问题,但我不想这样做,除非真的有必要.
编辑2:
使用Reflection完成此操作的方式如下:
var dispatcherType = typeof(Dispatcher);
var countField = dispatcherType.GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic);
var count = (int)countField.GetValue(Dispatcher.CurrentDispatcher);
var suspended = count > 0;
Run Code Online (Sandbox Code Playgroud) 我正在读Akka的调度员,我了解到它用于批量处理.什么是计算机科学的批量?
dispatcher ×10
c# ×3
wpf ×3
.net ×2
akka ×2
async-await ×1
asynchronous ×1
event-bus ×1
fatal-error ×1
install ×1
mongrel ×1
php ×1
routing ×1
winui-3 ×1