using System;
using System.Linq;
using Microsoft.Practices.Prism.MefExtensions.Modularity;
using Samba.Domain.Models.Customers;
using Samba.Localization.Properties;
using Samba.Persistance.Data;
using Samba.Presentation.Common;
using Samba.Presentation.Common.Services;
using System.Threading;
namespace Samba.Modules.TapiMonitor
{
[ModuleExport(typeof(TapiMonitor))]
public class TapiMonitor : ModuleBase
{
public TapiMonitor()
{
Thread thread = new Thread(() => OnCallerID());
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start();
}
public void CallerID()
{
InteractionService.UserIntraction.DisplayPopup("CID", "CID Test 2", "", "");
}
public void OnCallerID()
{
this.CallerID();
}
}
}
我正在尝试添加一些用C#开发的开源软件包,但我遇到了问题。上面(简化)示例的问题是,一旦调用了InteractionService.UserIntraction.DisplayPopup,我就会得到一个异常“调用线程无法访问此对象,因为另一个线程拥有它”。
我不是C#编码员,但是我已经尝试了很多东西来解决这个问题,比如代表,背景工作者等等。到目前为止,没有人能为我工作。
有人可以帮我吗?
答案 0 :(得分:2)
考虑通过Dispatcher在UI线程上调用该方法。 在您的情况下,我相信您应该将UI调度程序作为参数传递给您所描述类型的构造函数,并将其保存在字段中。然后,在打电话时,您可以执行以下操作:
if(this.Dispatcher.CheckAccess())
{
InteractionService.UserInteration.DisplayPopup(...);
}
else
{
this.Dispatcher.Invoke(()=>this.CallerID());
}
答案 1 :(得分:0)
您可以编写自己的DispatcherHelper来从ViewModel访问Dispatcher。我认为这是MVVM友好的。我们在我们的应用程序中使用了这样的实现:
public class DispatcherHelper
{
private static Dispatcher dispatcher;
public static void BeginInvoke(Action action)
{
if (dispatcher != null)
{
dispatcher.BeginInvoke(action);
return;
}
throw new InvalidOperationException("Dispatcher must be initialized first");
}
//App.xaml.cs
public static void RegisterDispatcher(Dispatcher dispatcher)
{
DispatcherHelper.dispatcher = dispatcher;
}
}