2016-08-03 14 views
1

私のカスタムOutlookアドインでは、いくつかのテキストボックスとログインボタンが含まれているWPFユーザーコントロールを読み込む(ホストする)機能があります。Outlookを追加しないで別のスレッドで別のスレッドを実行する

この私のログインボタンのクリックイベントハンドラ

private void lblbtnLogin_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 

      try 
      { 

       //this.Dispatcher.Invoke((Action)(() =>Login())); 
       this.Dispatcher.InvokeAsync((Action)(() => Login())); 
       //Thread loginThread = new Thread(new ThreadStart(Login)); 
       //loginThread.SetApartmentState(ApartmentState.STA); 
       //loginThread.IsBackground = true; 
       //loginThread.Start(); 
       //th.Start(); 
      } 
      catch (Exception exp) 
      { 
       string msg = exp.Message; 
      } 
     } 

とloginメソッドのコードはイムがこれを実行している間、私は、ディスパッチャとしてだけでなく、新しいスレッドを試みた

ここ
public void Login() 
     { 
      try 
      { 
       if (txtWSUrl.Text == "Enter WebService URL" || txtWSUrl.Text == string.Empty) 
       { 
        MessageBox.Show("WebService URL Cannot be Empty", string.Empty, MessageBoxButton.OK); 
       } 
       else if (txtEmailId.Text == "Enter Email ID" || txtEmailId.Text == string.Empty) 
       { 
        MessageBox.Show("Email ID Cannot be Empty", string.Empty, MessageBoxButton.OK); 
       } 
       else if (txtPwd.Password == "********" || txtPwd.Password == string.Empty) 
       { 
        MessageBox.Show("Password Cannot be Empty", string.Empty, MessageBoxButton.OK); 
       } 
       else 
       { 
        Globals.ThisAddIn.url = txtWSUrl.Text; 
        Summit_BLL.ProxyParamDetails ppd = new Summit_BLL.ProxyParamDetails(); 
        ppd.UserName = txtEmailId.Text; 
        ppd.Password = txtPwd.Password; 
        CommonParameters cp = new CommonParameters(); 
        cp._ProxyDetails = ppd; 

        //Summit_RESTWCF rest = new Summit_RESTWCF(); 
        //string o=rest.LoginApp(ppd); 

        string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(cp); 
        string strMethod = "LoginApp"; 
        string output = WSConsumer.GetWSResult(ref strJson, ref strMethod); 

        OutputParam op = Newtonsoft.Json.JsonConvert.DeserializeObject<OutputParam>(output); 
        if (op.Errors == string.Empty) 
        { 
         string objJson = op.Output; 
         AppUser obj = Newtonsoft.Json.JsonConvert.DeserializeObject<AppUser>(objJson); 
         if (obj.User.UserDetails.Count > 0) 
         { 
          foreach (UserDetail ud in obj.User.UserDetails) 
          { 

          } 
         } 
         //string Feedback = ConfigurationManager.AppSettings["App:RequiredFeedbackModule"].IsNotNullAndEmpty() ? ConfigurationManager.AppSettings["App:RequiredFeedbackModule"].ToString().ToUpper() : "NULL"; 
         WPFUCMaster master = WPFUCMaster.Instance; 
         WPFUCHome home = new WPFUCHome(); 
         master.AddControl(home); 
         //System.Windows.Threading.Dispatcher.Run(); 
        } 
        else 
        { 
         MessageBox.Show(op.Errors, string.Empty, MessageBoxButton.OK); 
        } 

       } 
      } 
      catch (Exception exp) 
      { 
       string msg = exp.Message; 
      } 
     } 

ですまた、次の画面が読み込まれるまでは、見通しがぶら下がったり、応答したりしません。

私は新しいスレッドを使用し、そのが異なる スレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません

のような例外をスローするコンストラクタのログイン方法を渡す場合。

誰でもこのお手伝いをしていただけますか?

+0

これは正常ですが、UIアイテムにはアクセスできないか、具体的にはUIスレッド外から変更されます。 – BugFinder

答えて

0

Outlookオブジェクトモデルオブジェクトは、メインスレッド以外のスレッドのアドインではアクセスできません。外部アプリケーションからOOMオブジェクトにアクセスすると、すべての呼び出しがメインのOutlookスレッドにマーシャリングされます。

セカンダリスレッド(かなりヒットしてミス)で作業するオブジェクトがありますが、Outlook 2016 OOMでは、セカンダリスレッドでアクセスを検出するとすぐに例外が発生します。あなたが行うことができます

カップルの事:あなたはわずか数スカラプロパティが必要な場合は、変数にプライマリスレッド上でそれらを読んで、あなたの二次スレッドからこれらの変数にアクセス

  1. 。 #1がオプションでない場合

  2. することは、あなたは、Extended MAPI(のみC++やDelphi)またはRedemption(任意の言語)を使用することができます - 変数に(それがIMAPISession MAPIオブジェクトを返す)Namespace.MAPIOBJECTプロパティの値を保存します。セカンダリスレッドでRDOSessionオブジェクトのインスタンスを作成し、RDOSession.MAPIOBJECTプロパティを設定します。これにより、メインのOutlookセッションが共有されます。これにより、RDOSession(約Namespaceオブジェクトに相当)を使用しているストアまたはアドレス帳オブジェクトにアクセスできます。

関連する問題