Краткий ответ: если вы предоставите обработчик событий для события «успех» или «ошибка», вы можете поместить новый запрос внутри этого обработчика событий и не беспокоиться о том, что транзакция автоматически закрывается.
Длинный ответ: Транзакция должна быть полностью прозрачной. Единственное правило заключается в том, что вы не можете открыть транзакцию при выполнении «базы данных» без базы данных. То есть вы не можете запустить транзакцию, затем держите ее открытой, выполняя некоторые XMLHttpRequests или ожидая, когда пользователь нажмет кнопку.
Как только вы перестанете размещать запросы на транзакцию и обратный вызов последнего запроса завершение транзакции автоматически закрывается.
Однако вы можете начать транзакцию, использовать эту транзакцию для чтения некоторых данных, а затем написать некоторые результаты.
Поэтому убедитесь, что у вас есть все данные, которые вам нужны, прежде чем вы начнете транзакцию, а затем выполните все чтения и записи, которые вы хотите сделать в обратных вызовах запроса. После того, как вы закончите, транзакция будет автоматически завершена.
PInvoke.net - ваш друг: -)
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1 {
class Program {
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)]
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);
const int WM_COMMAND = 0x111;
const int MIN_ALL = 419;
const int MIN_ALL_UNDO = 416;
static void Main(string[] args) {
IntPtr lHwnd = FindWindow("Shell_TrayWnd", null);
SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero);
System.Threading.Thread.Sleep(2000);
SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL_UNDO, IntPtr.Zero);
}
}
}
На сайте www.pinvoke.net есть много необходимой информации. Например, эта статья о SendMessage и FindWindow:
http://www.pinvoke.net/default.aspx/user32.SendMessage http://www.pinvoke.net/default.aspx/user32.FindWindow
Это, конечно, технически - но в основном вы используете p / invoke для вызова функций FindWindow и SendMessage API, чтобы выполнить то, что вы хотите. =)
Аналогичного результата можно достичь, отправив эти события клавиатуры, чтобы вызвать всплывающее меню панели задач и отправьте ему письмо "M":
public class DesktopHelper
{
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
/// <summary>
/// Shows the desktop.
/// </summary>
public static void ShowDesktop()
{
keybd_event(0x5B, 0, 0, 0);
keybd_event(0x4D, 0, 0, 0);
keybd_event(0x5B, 0, 0x2, 0);
}
}
Ранее я писал в блоге о том, как минимизировать и максимизировать использование P / Invoke из C #: http://improve.dk/minimizing-and-maximizing-windows/
Не совсем простой способ, но ручной способ - вызвать реализацию C ++. http://pinvoke.net помогает:
результаты поиска findwindow: http://pinvoke.net/search.aspx?search=findwindow&namespace= [All]
примерно четвертый В твоем случае помогает результат down.