pjsip c#,System.AccessViolationException,用于回答分离线程上的传入呼叫

时间:2017-07-31 06:04:45

标签: c# wpf multithreading sip pjsip

overrided void onIncomingCall我打开一个显示new (Popup) Form的新后台主题。 我尝试在此表单中接听或拒绝来电,但之后我收到System.AccessViolationException. 似乎当前的调用对象被锁定,无法从另一个Form访问。 如果我在currentcall.answer(prm) void中使用onIncomingCall,那么呼叫就会成功建立(没有其他表格和线程)。

public class myaccount : Account
{

   public override void onIncomingCall(OnIncomingCallParam prm)
   {
       Call call = new Call(this, prm.callId);
       CallOpParam param = new CallOpParam();


       param.statusCode = pjsip_status_code.PJSIP_SC_RINGING;
       param.statusCode = pjsip_status_code.PJSIP_SC_OK;
       pjsipfunctions.currentparam = param;
       pjsipfunctions.currentcall = call;


       var thread = new Thread(() =>
       {
           ShowPopup(call,prm.callId.ToString());

       });
       thread.SetApartmentState(ApartmentState.STA);
       thread.Start();

       //    Thread myCallingThread = new Thread(new ThreadStart(ShowPopup));
       //myCallingThread.SetApartmentState(ApartmentState.STA);
       //myCallingThread.IsBackground = true;
       //myCallingThread.Start();



   }
   public void ShowPopup(Call myCall,string call_id)
   {
       IncommingCallPopup win = new IncommingCallPopup(ref myCall, call_id );

       win.Show();
       System.Windows.Threading.Dispatcher.Run();


     }


}

#####################################
public IncommingCallPopup(ref  Call info, string callid)
   {
       currentCall = info;
        Callid = callid;
       CurrentCall = currentCall;
       Prm.statusCode = pjsip_status_code.PJSIP_SC_RINGING;
       InitializeComponent();
       labelCallId.Content = callid;

   }

   private void rejectcall(object sender, RoutedEventArgs e)
   {
       Prm.statusCode = pjsip_status_code.PJSIP_SC_DECLINE;
       CurrentCall.hangup(Prm);
   }

   private void transfercall(object sender, RoutedEventArgs e)
   {

   }

   private void takecall(object sender, RoutedEventArgs e)
   {

       Prm.statusCode = pjsip_status_code.PJSIP_SC_OK;
       try
       {
           CurrentCall.answer(Prm);
       }
       catch(Exception ex)
       {

       }

   }

1 个答案:

答案 0 :(得分:2)

疯狂搜索并尝试了一些我已经弄明白的东西。 每个线程必须在端点中注册,您可以在另一个类(窗口)中挂断,接听或转移您的呼叫。

您只需要在Public类中编写此方法,并在每次从另一个窗口调用void时调用此void - >

public void callpopup(String number) {
     checkThread();

//answer, decline or something else

}

[MethodImpl(MethodImplOptions.Synchronized)]
    public static void checkThread()
    {
        try
        {

            if (ep != null && !ep.libIsThreadRegistered())
                ep.libRegisterThread(Thread.CurrentThread.Name);

        }
        catch (Exception e)
        {


        }
    }