我调用了一个方法,它返回一个UIElement我使用的调用Dispatcher,下面是代码.
但是,Dispatcher调用的返回值总是为NULL,任何想法?
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
var slides = (IList<UIElement>)e.Argument;
var bmpSlides = new List<UIElement>();
var imageService = new ImageService();
int count = 0;
foreach (UIElement slide in slides)
{
object retVal = slide.Dispatcher.Invoke(
new ThreadStart(() => imageService.GenerateProxyImage(slide)));
bmpSlides.Add(imageService.GenerateProxyImage(slide));
_backgroundWorker.ReportProgress(count / 100 * slides.Count);
count++;
}
e.Result = bmpSlides;
}
Run Code Online (Sandbox Code Playgroud) 我有一个嵌入了Geospace地图的程序.地图的事件处理在单独的线程上处理,以使地图保持响应(例如,单击地图时触发的事件).
我遇到的问题是当地图触发一个事件时,我的程序需要更新它的gui中的一些东西,并且还回调到地图以处理在地图上放置图片.
我尝试在this.Dispatcher.Invoke中包装整个事件处理程序方法,这使我回到主UI线程.这对于更新我的GUI非常有用,但是当我回调到地图时,我仍然在UI线程上,这可能会导致地图中出现一些问题.
基本上,为了使这项工作,每次我想要更改我的gui上的控件时,我将不得不运行dispatcher.invoke.有没有办法我可以自动执行此操作而不在dispatcher.invoke中包装每个调用?我希望这一切都有道理.
下面是我正在谈论的事件的一些示例代码.
private void Map_OnMapClicked(object sender, MapClickedEventArgs e)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
// Do something to update my gui
}));
Map.DoSomethingInTheMap();
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
// Do something to update my gui
}));
//etc etc etc
}
Run Code Online (Sandbox Code Playgroud) 好吧,这可能非常简单,但我尝试的一切似乎都打成了砖墙.
我有一个带有两个属性的视图模型,它们绑定到我的WPF表单:
bool IsWorking {get;set;}
ObservableCollection<OtherViewModel> PendingItems {get;set;}
Run Code Online (Sandbox Code Playgroud)
我有一个方法,我调用从outlook中获取一些新的待处理项,但是我还要在表单上显示某些进度(旋转进度条),进度条可见性绑定到ViewModel上的IsWorking属性,以及网格绑定到PendingItems集合.
我希望能够将IsWorking设置为true,以便UI可以显示进度条,在后台运行工作,然后在完成后将IsWorking设置为false,这样进度条就会消失.
我创建了一个这样的背景工作者:
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
现在,worker_DoWork调用获取挂起项的方法并将它们添加到PendingItems集合中,所有内容都在后台运行,UI仍然响应,但在尝试添加到集合时,我得到了正常的交叉线程错误.我在调度程序调用中包装了更改集合的代码:
// Update to show the status dialog.
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render,
new Action(delegate()
{
this.PendingItems.Add(\\Blah);
})
);
Run Code Online (Sandbox Code Playgroud)
但它仍然会抛出相同的交叉线程错误.
我对线程不是很好,所以我不知道我可能做错了什么,有人能帮我一把吗?
在对象的构造函数中,我需要创建一个WPF mediaElement对象:
m_videoMedia = new MediaElement();
Run Code Online (Sandbox Code Playgroud)
但是这个类也可以从其他线程实例化,所以我需要使用
Dispatcher.Invoke(DispatcherPriority.Normal,
(Action)(() => { m_videoMedia = new MediaElement(); }));
Run Code Online (Sandbox Code Playgroud)
但是如何在该构造函数中获得正确的调度程序实例:s
.NET 3.5和WPF中的Dispatcher概念与.NET 2.0中的后台线程有何不同?
例如,下面的陈述之间有什么区别:
delegate.Invoke/BeginInvoke
Run Code Online (Sandbox Code Playgroud)
和
this.dispatcher.Invoke/BeginInvoke
Run Code Online (Sandbox Code Playgroud) 我正在开发一个显示多个TabItems 的支持工具TabControl.每个TabItem代表一个员工,在这些员工Tab的每个人中都有另一个TabControl包含额外TabItem的员工.这些TabItem代表该员工的Outlook文件夹(如"正在工作","已完成"等).这些文件夹中TabItem的每一个都包含一个ListBox绑定到与该Outlook文件夹相关ObservableCollection的MailItems的文件夹.这些不是巨大的收藏 - 每个只有十几件ListBox.虽然总的来说,所有人都TabItem可以想到100件左右.
我目前构建应用程序的方式是应用程序启动并使用相应的员工选项卡和子选项卡填充屏幕.这个过程相当快,我很高兴.我创建了一个静态Global.System.Timer文件,所有文件夹TabItem的代码隐藏都与之同步.因此,应用程序每5分钟清除一次ObserverableCollection并重新扫描Outlook文件夹.
问题是扫描过程使应用程序停止.我尝试使用a BackgroundWorker从Outlook收集邮件作为后台进程,然后将一个List<MailItem>对象传递给一个RunWorkerCompleted方法,然后运行一个this.Dispatcher.BeginInvoke清除相应的进程,ObservableCollection然后将项目从List<MailItem>后面添加到ObservableCollection.我甚Dispatcher至将此设置为较低优先级.
尽管如此,在扫描/填充ListBox过程中应用程序非常笨重.我不清楚如何更好地设计这个,我承认我对此有些新意.我意识到清除每个ObservableCollections都是低效的,但Outlook文件夹更改事件并不是特别可靠,所以我需要每隔一段时间重新扫描一次以确保所有MailItems都被表示.
下面是我的WPF控件的代码,其中包含ListBox.请记住,这些ListBox控件中大约有10个同时处于活动状态.
// This entire UserControl is essentially a ListBox control
public partial class TicketListView : …Run Code Online (Sandbox Code Playgroud) 我找了很长时间没有成功解决这个问题的方法.
我正在将一些C#代码移植到F#,我正在为一个WPF元素的Dispatcher.Invoke而苦苦挣扎.由于我是F#中的总菜鸟,我唯一能确定的是问题出在椅子和键盘之间.
这是我的C#代码:
foreach (var k in ChartList.Keys)
{
ChartList[k].Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
ChartList[k].Width = area.Width / totalColsForm;
ChartList[k].Height = area.Height / totalRowsForm;
ChartList[k].Left = area.X + ChartList[k].Width * currentCol;
ChartList[k].Top = area.Y + ChartList[k].Height * currentRow;
ChartList[k].doShow();
}
));
}
Run Code Online (Sandbox Code Playgroud)
我正在努力的部分是新的Action(delegate()...).编译器不喜欢我试图翻译它.
F#中这个片段的翻译是什么?
我的项目中有以下结构
\ myapp
\ app
__init__.py
views.py
run.py
Run Code Online (Sandbox Code Playgroud)
以下代码:
run.py
from app import create_app
if __name__ == '__main__':
app = create_app()
app.run(debug=True, host='0.0.0.0', port=5001)
Run Code Online (Sandbox Code Playgroud)
views.py
@app.route("/")
def index():
return "Hello World!"
Run Code Online (Sandbox Code Playgroud)
_ init _.py
from flask import Flask
def create_app():
app = Flask(__name__)
from app import views
return app
Run Code Online (Sandbox Code Playgroud)
我试图每次使用不同的文件factory design pattern来创建我的app对象config,并且子域调度程序能够根据subdomain用户请求创建和路由不同的对象.
我正在关注他们谈论的Flask文档,所有这些:
但我无法使它工作,似乎我的实际项目structure没有办法将app对象扔到我的views.py投掷和它NameError
NameError:未定义名称"app"
试图制作一些弹簧示例程序 - 不断得到错误 - 发生我的控制器无法处理/你好请求.这是来自log4j的调试信息.
13:50:58,502 {TRACE} DispatcherServlet.initContextHolders:1018 - Bound request context to thread: org.apache.catalina.connector.RequestFacade@636f2067
13:50:58,503 {DEBUG} DispatcherServlet.doService:823 - DispatcherServlet with name 'springtest' processing GET request for [/springtest_2/hello]
13:50:58,504 {TRACE} DispatcherServlet.getHandler:1088 - Testing handler map
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@7bab2c3] in DispatcherServlet with name 'springtest'
13:50:58,504 {DEBUG} RequestMappingHandlerMapping.getHandlerInternal:220 - Looking
up handler method for path /hello
13:50:58,504 {DEBUG} RequestMappingHandlerMapping.getHandlerInternal:230 - Did not find handler method for [/hello]
13:50:58,504 {TRACE} DispatcherServlet.getHandler:1088 - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@722e242b] in DispatcherServlet with name 'springtest'
13:50:58,505 {TRACE} BeanNameUrlHandlerMapping.getHandlerInternal:127 - …Run Code Online (Sandbox Code Playgroud) 我试图在Apache中配置Access-Control-Allow-Origin以允许某些域.下面是我的httpd配置
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Run Code Online (Sandbox Code Playgroud)
但上面的配置没有做任何事情.听说我们需要启用mod_headers才能使它工作.我运行这个httpd -M命令,发现我的Apache中没有头模块.你能不能告诉我如何启用?