0
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# 编码器,但我已经尝试了很多方法来解决这个问题,比如 Delegates、BackgroundWorkers 等等,但到目前为止没有一个对我有用。

有人可以帮我吗?

4

2 回答 2

2

考虑通过 Dispatcher 调用 UI 线程上的方法。在您的情况下,我相信您应该将 UI 调度程序作为参数传递给您描述的类型的构造函数并将其保存在一个字段中。然后,在调用时,您可以执行以下操作:

if(this.Dispatcher.CheckAccess())
{
    InteractionService.UserInteration.DisplayPopup(...);
}
else
{
    this.Dispatcher.Invoke(()=>this.CallerID());
}
于 2013-02-22T10:19:42.090 回答
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;
        }
    }
于 2013-02-22T11:06:03.190 回答