C# 如何从另一个线程访问对象(PrintSystemJobInfo)
我有一个STA线程,它将PrintJob添加到PrinterQueue。这个打印作业应该被监控,我认为定时器是正确的选择。但显然,我无法访问计时器线程中的PrintSystemJobInfo对象 我怎样才能解决这个问题 我的想法是,我必须使用一个同步对象,但我不知道如何使用,我不确定这是否能解决我的问题。。。或者有没有其他技术(可能是调度员?)我可以利用 是否可以设置计时器STA,以便我可以在计时器线程中创建printjob(printqueue.addjob需要STA)?但我想这是一个解决办法 非常感谢您的帮助 thx,effdee 编辑: 一些伪代码:C# 如何从另一个线程访问对象(PrintSystemJobInfo),c#,multithreading,printing,C#,Multithreading,Printing,我有一个STA线程,它将PrintJob添加到PrinterQueue。这个打印作业应该被监控,我认为定时器是正确的选择。但显然,我无法访问计时器线程中的PrintSystemJobInfo对象 我怎样才能解决这个问题 我的想法是,我必须使用一个同步对象,但我不知道如何使用,我不确定这是否能解决我的问题。。。或者有没有其他技术(可能是调度员?)我可以利用 是否可以设置计时器STA,以便我可以在计时器线程中创建printjob(printqueue.addjob需要STA)?但我想这是一个解决办法
class WcfService
{
public int ServiceFunc() {
Thread staThread = new Thread(myObj.myFunc);
staThread.setSTA() and start()
staThread.join()
return myObj.status;
}
}
-
您可以向两个线程公开PrintSystemJobInfo对象,并在使用时锁定它。如果另一个线程正在使用该对象,则应暂停该对象在线程中的使用
等等,别客气。您需要在主线程(使用STA)中创建一个方法addJob,该方法调用addJob()。在另一个线程中,您可以使用Dispatcher.invoke调用该方法,并在主线程上运行该方法
或者干脆这样做:
void Thread2()
{
Dispatcher.Invoke(new Action(() =>
{
PrintSystemJobInfo.AddJob();
//or any other methods you want executed on the main thread
}
}
您可以向两个线程公开PrintSystemJobInfo对象,并在使用时锁定它。如果另一个线程正在使用该对象,则应暂停该对象在线程中的使用
等等,别客气。您需要在主线程(使用STA)中创建一个方法addJob,该方法调用addJob()。在另一个线程中,您可以使用Dispatcher.invoke调用该方法,并在主线程上运行该方法
或者干脆这样做:
void Thread2()
{
Dispatcher.Invoke(new Action(() =>
{
PrintSystemJobInfo.AddJob();
//or any other methods you want executed on the main thread
}
}
如果你有一个STA线程,那么你几乎必须有一个消息泵。所以一个同步计时器可以正常工作。使用Winforms定时器或WPF调度程序。老实说,我没有sta线程或“消息泵”的经验。。。只是在我的问题中添加了一些伪代码。。。消息泵仍然相关?问题已避免(请参阅我的其他评论)。。。无论如何,我真的很感谢你的支持。。。THXI如果你有一个STA线程,那么你几乎必须有一个消息泵。所以一个同步计时器可以正常工作。使用Winforms定时器或WPF调度程序。老实说,我没有sta线程或“消息泵”的经验。。。只是在我的问题中添加了一些伪代码。。。消息泵仍然相关?问题已避免(请参阅我的其他评论)。。。无论如何,我真的很感谢你的支持。。。谢谢你的努力!看起来不错;)我会尽力给你反馈。。。实际上,我有一个创建STA线程的wcf服务。但在这种情况下,这并不重要,不是吗?不,这不重要。您必须检查您正在使用的Dispatcher对象是否是来自主线程的Dispatcher。我尝试过,但遗憾的是失败了。。。在问题中编辑了我的代码到我当前的dispatcher逻辑实现。。。其想法是wcf服务响应客户端,但服务器检查打印机状态(即使在响应之后-因此是计时器/线程…),我不知道为什么,但目前似乎计时器没有执行。。。您可以尝试使用System.Timers.Timer并按照以下示例进行操作:thx供您评论,但我们现在更改了系统并为线程问题创建了解决方案。。。我有一个想法,它应该如何工作,并希望能够在下一个项目中正确实施它。。。再次使用thx(因为它帮助了我,所以我会投赞成票,但我没有得到足够的代表…)大thx的努力!看起来不错;)我会尽力给你反馈。。。实际上,我有一个创建STA线程的wcf服务。但在这种情况下,这并不重要,不是吗?不,这不重要。您必须检查您正在使用的Dispatcher对象是否是来自主线程的Dispatcher。我尝试过,但遗憾的是失败了。。。在问题中编辑了我的代码到我当前的dispatcher逻辑实现。。。其想法是wcf服务响应客户端,但服务器检查打印机状态(即使在响应之后-因此是计时器/线程…),我不知道为什么,但目前似乎计时器没有执行。。。您可以尝试使用System.Timers.Timer并按照以下示例进行操作:thx供您评论,但我们现在更改了系统并为线程问题创建了解决方案。。。我有一个想法,它应该如何工作,并希望能够在下一个项目中正确实施它。。。thx再次(投票支持,因为它帮助了我,但我没有得到足够的代表权…)