2013-05-03 4 views
0

Я новичок в MVC3. В моем проекте MVC3 я использую threading для импорта excel в базу данных, и он отлично работает. У меня есть сомнения в следующем: 1) Как остановить поток с помощью CancellationToken ?? - В моей форме MVC# у меня есть следующие .. 2 кнопки с именем Cancel и Import соответственно. 2) При нажатии кнопки «Отправить» у меня есть следующий код.Как использовать cancelationToken в MVC3?

//Button Click on Import 
    [HttpPost] 
    public ActionResult FinalImport(FormCollection collection) 
     { 
      Task.Factory.StartNew(() => 
      { 
       //My Coding To Import 

      } , tokenSource.Token); 

      return null; 
     } 

    CancellationTokenSource tokenSource=new CancellationTokenSource(); 

    //Button Click on Cancel 
    public void CancelToken() 
    { 
     tokenSource.Token.ThrowIfCancellationRequested(); 
     tokenSource.Cancel(); 
     // return null; 
    } 

Примечание: Если я нажимаю кнопку импорта и при выполнении задачи и затем нажмите кнопку Отмена MENAS ничего не случится .. Как отменить выполнение процесса резьбы. Пожалуйста, помогите мне в достижении этого ...

ответ

3

Поскольку сеть по существу является средой без гражданства, вам необходимо каким-то образом сохранить токен отмены с одного запроса на другой. Методы FinalImport и CancelToken являются отдельными запросами. Приложение рассматривает каждый как новый, как если бы он никогда не видел предыдущий запрос раньше. Вы пишете код так, как будто он работает в среде с сохранением состояния.

Следующие могут работать для вас.

Вот шаги высокого уровня:

  • Создать свой tokenSource в методе FinalImport.
  • Добавьте источник токена в словарь с уникальным ключом, который будет сохраняться. (Скажем, один объявлен как статический, так что он является глобальным для всего приложения).
  • Передать ключ в браузер.

Когда пользователь нажимает кнопку отмены в браузере:

  • Есть браузер послать ключ в запросе.
  • В вашем CancelToken найдите словарь с помощью ключа, который браузер отправляет с запросом.
  • Используйте токен источника из словаря, чтобы отменить задачу.
  • Удалить токен из словаря.

Вы должны также, как последняя вещь в вашей задаче, удалить маркер из словаря (в противном случае они будут просто строить вверх и вверх и вверх, пока вы бежите из памяти)

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

Хотя я понимаю, что это не кодовое решение, я надеюсь, что это поможет лучше понять проблемную область.

+0

Могу ли я отправить мне код модели @Colin Mackay .. –

+0

Хорошее решение. Попробуй. Спасибо –

0

И наконец, я нашел решение.

1) Нужно инициализировать CancellationTokenSource как статичный.

2) Необходимо уничтожить токен объекта CancellationTokenSource в методе CancelToken
Звонок.

public static CancellationTokenSource tokenSource; 

[HttpPost] 
    public ActionResult FinalImport(FormCollection collection) 
     { 
      tokensource=new CancellationTokenSource(); 
      Task.Factory.StartNew(() => 
      { 
       if (ts.IsCancellationRequested) 
          { 
           break; 
          } 
       //My Coding To Import 

      } , tokenSource.Token); 

      return null; 
     } 



    //Button Click on Cancel 
    public void CancelToken() 
    { 

     tokenSource.Cancel(); 
     tokensource.Dispose(); 
    } 

Вот это .. Днем Coding .... !!!!

+3

У вас может быть проблема масштабирования за пределами одного пользователя – Foole

+0

Как преодолеть проблему масштабирования @Foole –

Смежные вопросы