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

  • 1 comment