Я нашел проблему.Сначала несколько вещей о классе filterCtiCallLog.Я разработал его так, чтобы он работал как асинхронно, так и синхронно.Для начала я написал код для асинхронного выполнения.Мне нужен был способ инициировать события из дочернего рабочего потока в родительский, чтобы сообщить о рабочем состоянии.Для этого я использовал класс AsyncOperation и метод post.Вот часть кода для запуска события CtiCallsRetrieved.
public class FilterCtiCallLog
{
private int RequestCount = 0;
private AsyncOperation createCallsAsync = null;
private SendOrPostCallback ctiCallsRetrievedPost;
public void CreateFilteredCtiCallLogSync()
{
createCallsAsync = AsyncOperationManager.CreateOperation(null);
ctiCallsRetrievedPost = new SendOrPostCallback(CtiCallsRetrievedPost);
CreateFilteredCtiCallLog();
}
private void CreateFilteredCtiCallLog()
{
int count=0;
//do the job
//............
//...........
//Raise the event
createCallsAsync.Post(CtiCallsRetrievedPost, new CtiCallsRetrievedEventArgs(count));
//...........
//...........
}
public event EventHandler<CtiCallsRetrievedEventArgs> CtiCallsRetrieved;
private void CtiCallsRetrievedPost(object state)
{
CtiCallsRetrievedEventArgs args = state as CtiCallsRetrievedEventArgs;
if (CtiCallsRetrieved != null)
CtiCallsRetrieved(this, args);
}
}
Как видите, код выполняется синхронно.Проблема здесь в методе AsyncOperation.Post()
.Я предположил, что если он вызывается в основном потоке, он будет действовать как простой запуск события, а не отправка его в родительский поток.Однако это был не тот случай.Я не знаю, как это работает, но я изменил код, чтобы проверить, называется ли CreateFilteredCtiCallLog
синхронизацией или асинхронностью.И если это асинхронный вызов, я использовал метод AsyncOperation.Post
, если нет, я просто вызвал EventHandler
, если это не null
.Вот исправленный код
public class FilterCtiCallLog
{
private int RequestCount = 0;
private AsyncOperation createCallsAsync = null;
private SendOrPostCallback ctiCallsRetrievedPost;
public void CreateFilteredCtiCallLogSync()
{
createCallsAsync = AsyncOperationManager.CreateOperation(null);
ctiCallsRetrievedPost = new SendOrPostCallback(CtiCallsRetrievedPost);
CreateFilteredCtiCallLog(false);
}
private void CreateFilteredCtiCallLog(bool isAsync)
{
int count=0;
//do the job
//............
//...........
//Raise the event
RaiseEvent(CtiCallsRetrievedPost, new CtiCallsRetrievedEventArgs(count),isAsync);
//...........
//...........
}
public event EventHandler<CtiCallsRetrievedEventArgs> CtiCallsRetrieved;
private void RaiseEvent(SendOrPostCallback callback, object state, bool isAsync)
{
if (isAsync)
createCallsAsync.Post(callback, state);
else
callback(state);
}
private void CtiCallsRetrievedPost(object state)
{
CtiCallsRetrievedEventArgs args = state as CtiCallsRetrievedEventArgs;
if (CtiCallsRetrieved != null)
CtiCallsRetrieved(this, args);
}
}
Спасибо всем за ответы!