Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个线程访问对象(PrintSystemJobInfo)_C#_Multithreading_Printing - Fatal编程技术网

C# 如何从另一个线程访问对象(PrintSystemJobInfo)

C# 如何从另一个线程访问对象(PrintSystemJobInfo),c#,multithreading,printing,C#,Multithreading,Printing,我有一个STA线程,它将PrintJob添加到PrinterQueue。这个打印作业应该被监控,我认为定时器是正确的选择。但显然,我无法访问计时器线程中的PrintSystemJobInfo对象 我怎样才能解决这个问题 我的想法是,我必须使用一个同步对象,但我不知道如何使用,我不确定这是否能解决我的问题。。。或者有没有其他技术(可能是调度员?)我可以利用 是否可以设置计时器STA,以便我可以在计时器线程中创建printjob(printqueue.addjob需要STA)?但我想这是一个解决办法

我有一个STA线程,它将PrintJob添加到PrinterQueue。这个打印作业应该被监控,我认为定时器是正确的选择。但显然,我无法访问计时器线程中的PrintSystemJobInfo对象

我怎样才能解决这个问题

我的想法是,我必须使用一个同步对象,但我不知道如何使用,我不确定这是否能解决我的问题。。。或者有没有其他技术(可能是调度员?)我可以利用

是否可以设置计时器STA,以便我可以在计时器线程中创建printjob(printqueue.addjob需要STA)?但我想这是一个解决办法

非常感谢您的帮助

thx,effdee

编辑: 一些伪代码:

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再次(投票支持,因为它帮助了我,但我没有得到足够的代表权…)