EF контекст и многопоточность - PullRequest
3 голосов
/ 25 декабря 2011

Мне было интересно, если кто-нибудь объяснит мне, что не так в моем коде. Я запускаю таймер в дополнительной теме. В функции таймера я работаю с EF-контекстом. Я вижу, что функция таймера сработала 6 раз, и я специально установил интервал в 3 секунды и занимал только 100 строк, но в моей БД я вижу только одну работу. Так где моя ошибка?

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private static int cnt = 0;
        private Thread thread;

        public Form1()
        {
            InitializeComponent();
        }

        private  void StartThread()
        {
            var timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(ProcessDb);
            timer.Interval = 3000;
            timer.Start();
        }

        public void ProcessDb(object sender, System.Timers.ElapsedEventArgs e)
        {
            cnt++;
            ConnService serv = new ConnService();
            serv.UpdateConnections(cnt);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            thread = new Thread(StartThread);
            thread.Start();

            Thread.Sleep(20000);
        }
    }

    public class MyqQueue
    {
        public static Stack<int> myStack = new Stack<int>();
        public static Stack<int> myStack2 = new Stack<int>();
    }
}

namespace WindowsFormsApplication2
{
    class ConnService
    {
        public ConnService()
        {
            cnt++;
        }

        private static int cnt;
        public void UpdateConnections(int second)
        {
            MyqQueue.myStack.Push(second);

            DjEntities ctx = new DjEntities();
            var entities = ctx.Connections.Take(100).Where(c => c.State == null);
            foreach (var connection in entities)
            {
                connection.State = second;
            }
            if (second == 1)
                Thread.Sleep(7000);

            MyqQueue.myStack2.Push(second);
            ctx.SaveChanges();
        }
    }
}

1 Ответ

1 голос
/ 25 декабря 2011
 ctx.Connections.Take(100).Where(c => c.State == null)

Должен быть изменен на

 ctx.Connections.Where(c => c.State == null).Take(100)

Ваш первый запрос переводится на первый дубль 100 без фильтрации, а затем применить фильтр.

Во втором написанном мной запросе будут отфильтрованы элементы, а затем 100 лучших.

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