Silverlight 4 Ria Services и несколько потоков

У меня очень долгий запрос, который занимает слишком много времени, чтобы мой клиент оставался подключенным. Я хочу позвонить в свой DomainService, создать новый рабочий поток, а затем вернуться из службы, чтобы мой клиент мог затем начать опрос, чтобы увидеть, завершен ли длительный запрос.

Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку мой вызывающий поток немедленно завершается, я получаю исключения, когда мой рабочий пытается получить доступ к любым объектам, поскольку ObjectContext удаляется, когда исходный поток завершается.

Вот как я создаю новый контекст и вызываю из моего клиента Silverlight:

MyDomainContext context = new MyDomainContext();
context.SearchAndStore(_myParm, SearchQuery,
    p => {
        if (p.HasError) { // Do some work and return to start 
        }                 // polling the server for completion...
    }, null);

Метод входа на сервер:

[Invoke]
public int SearchAndStore(object parm)
{
    Thread t = new Thread(new ParameterizedThreadStart(SearchThread));
    t.Start(parms);     
    return 0;
    // Once this method returns, I get ObjectContext already Disposed Exceptions
}

Вот метод WorkerProc, который вызывается с новым потоком. Как только я пытаюсь перебрать свой объект query1, я получаю исключение ObjectContext already Disposed.

private void WorkerProc(object o)
{
    HashSet<long> excludeList = new HashSet<long>();

    var query1 = from doc in this.ObjectContext.Documents
        join filters in this.ObjectContext.AppliedGlobalFilters
            .Where(f => f.FilterId == 1)  
        on doc.FileExtension equals filters.FilterValue
        select doc.FileId;

    foreach (long fileId in query1) // Here occurs the exception because the
    {                               // Object Context is already disposed of.
        excludeList.Add(fileId);
    }
}

Как я могу этого избежать? Есть ли способ создать новый контекст для нового потока? Я действительно застрял на этом.

Спасибо.


person Scott    schedule 02.02.2011    source источник
comment
Дубликат - stackoverflow.com/questions/4869346/   -  person jweyrich    schedule 02.02.2011
comment
Что сказать, я в отчаянии!   -  person Scott    schedule 03.02.2011
comment
Если это существенно не отличается, вам следует отредактировать исходный вопрос, а не публиковать новый. См. - http://stackoverflow.com/questions/4869346/polling-pattern-for-silverlight-4-wcf-ria-services   -  person ChrisF    schedule 05.02.2011


Ответы (1)


Поскольку вы используете WCF RIA. Я должен предположить, что вы реализуете две части:

  • Веб-служба WCF
  • Клиент Silverlight, использующий службу WCF.

Итак, это означает, что у вас есть два приложения. Служба, работающая в IIS, и Silverlight, работающая в веб-браузере. У этих приложений разный жизненный цикл. Приложение silverlight начинает работать, когда оно загружается на веб-страницу, и умирает, когда страница закрывается (или происходит исключение). С другой стороны (на стороне сервера) жизнь веб-службы WCF довольно проста. Ваше приложение начинает работать, когда запрашивается услуга, и умирает после завершения запроса.

В вашем случае запрос сервера завершается, когда завершается метод SearchAndStore. Таким образом, когда запускается этот конкретный метод, вы создаете поток, который запускается в фоновом режиме (на сервере), и ваш метод продолжает выполнение, которое с большей вероятностью завершится через пару строк.

Если я прав, тебе не нужно этого делать. Вы можете вызвать свой метод без использования потока, теоретически не имеет значения, потребуется ли время для ответа. это потому, что приложение Silvelight (на клиенте) не будет ждать. В Silverlight все операции асинхронны (это означает, что они выполняются в собственном потоке). Следовательно, когда вы вызываете метод службы из клиента, вам нужно только дождаться вызова обратного вызова.

Если это действительно занимает много времени, вы, скорее всего, будете искать механизм, чтобы поддерживать соединение между вашим клиентом Silverlight и вашим веб-сервером дольше. Думаю, изменив конфигурацию сервиса.

Вот пример того, что я говорю: https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01 В этом примере вы можете увидеть разное время на стороне клиента и сервера. Вы нажимаете кнопку и должны ждать 30 секунд, чтобы получить ответ от сервера.

Надеюсь, это поможет, С уважением, Гербер

person hmadrigal    schedule 04.02.2011