Silverlight 4 Ria Services и несколько потоков - PullRequest
1 голос
/ 02 февраля 2011

У меня очень длительный запрос, который слишком долго удерживает моего клиента на связи. Я хочу сделать вызов в мой 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 уже 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);
    }
}

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

Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2011

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...