he_caxap (he_caxap) wrote in csharp_ru,
he_caxap
he_caxap
csharp_ru

Вызов СОМ метода из другого треда

Предположим есть СОМ обьект.

//generated by interop
public interface IMyEvents{
void OnChange(ref string data, ref bool b);
}

public class cMyClass : IMyContextor
{
private IMyEvents _oIMyEvents = null;
private System.Threading.Timer wTimer = null;
public void Initialize(ref object oEnv, ref IMyEvents oIMyEvents){
//не важно...
_oIMyEvents = oIMyEvents;
wTimer = new System.Threading.Timer(this.TimerCallback_CheckAppState, this, 0, 1000);
}

private void TimerCallback_CheckAppState(Object ts)
{
string data = "abc";//valid string
bool b = true; //valid value

//Throws an exception
//System.AccessViolationException - "Attempted to read or write protected memory. This is often an indication that other memory is corrupt"
_oIMyEvent.OnChange(ref data, ref b);
}

//всякая другая всячина
}

Подозреваю, что exception происходит из-за того, что СОМ обьект (не мой, написан на VB, поменять не могу) вызывается из другого треда (таймеровый тред);
Моя интуиция подсказывает мне, что возможно надо Marshal этот вызов как-то. Но не могу нигде найти пример, как маршалить вызов из одного треда в СОМ обьект.
В основном это делается через Invoke на форме, для UI треда, но тут нет UI треда, и, соответственно Invoke :(
Все обьекты существуют, пойнтеры не нули, и тд ...

Подскажите, может где-нибудь описанно, или кто-нибудь сам знает как бороться с этой проблемой? :)


х-posted in ru_csharp
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment