Как получить доступ к объекту (PrintSystemJobInfo) из другого потока - PullRequest
1 голос
/ 30 ноября 2011

У меня есть STA-поток, который добавляет PrintJob в очередь для печати.Этот PrintJob должен контролироваться, и я подумал, что Таймер будет правильным решением.Но, очевидно, я не могу получить доступ к PrintSystemJobInfo-Object в потоке таймера.

Как я могу решить эту ситуацию?

Мне пришло в голову, что мне нужно использовать синхронизированный объект, но я неЯ не знаю, как это сделать, и я не уверен, что это решит мою проблему ... Или есть другая техника (возможно, диспетчер?), которую я могу использовать?

Можно ли сделать таймер STA такимя могу создать printjob в потоке таймера (sta требуется для printqueue.addjob)?Но я думаю, что это был бы обходной путь ...

Любая помощь очень ценится ...

thx, effdee

edit: некоторый псевдокод:

class WcfService
{
 public int ServiceFunc() {
  Thread staThread = new Thread(myObj.myFunc);
  staThread.setSTA() and start()
  staThread.join()

  return myObj.status;
 }
}

-

class myObj
{
 public int status;
 public PrintSystemJobInfo printJob;
 public Dispatcher d;

 public void myFunc()
 {
  d = CurrentDispatcher;

  printJob = printQueue.AddJob(...);
  if (printJob == null) status = 0;
  else status = 1;      

  Timers.Timer timer = new Timer(invokeTimer);
  timer.Start();
 }

 public void invokeTimer(args)
 {
  d.Invoke(new Action(() => { timerFunc(args) }));
 }

 public void timerFunc(args)
 {
  //access printJob problem here ;)

  writePrintJobDetailsToDatabase();
 }
}

1 Ответ

1 голос
/ 30 ноября 2011

Вы можете предоставить объект PrintSystemJobInfo обоим потокам и заблокировать его при использовании.Это должно приостановить использование объекта в потоке, если другой использует его.

wait, не имеет значения.Вам нужно создать метод addJob в вашей основной ветке (с помощью STA), который вызывает AddJob ().В другом потоке вы можете вызвать этот метод с помощью Dispatcher.Invoke и запустить метод в основном потоке.

Или просто сделать это:

void Thread2()
{
   Dispatcher.Invoke(new Action(() => 
   {
       PrintSystemJobInfo.AddJob();
       //or any other methods you want executed on the main thread
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...