Been going down this road all month....
Do you use any control transfers? If so things get twice as hard.
Assuming you have a normal interrupt based USB poll every 8-10ms you can tie everything to the usbpoll. Somewhere in your code you should have a line like so.
while (!usbInterruptIsReady()) usbPoll(); usbSetInterrupt( reportBuffer,
//add code here..
If you do your pages at this point you have 8 ms of free time to play. Now if you are using a control transfer to tell the driver to do page writes, things get a bit more complicated. I set a global bit that I turn on after the control transfer completes them check for that bit where I added the comment above and do the work. This will worked for any software written in c or c++ but forget about c#.