Обработка исключений, организация очередей и синхронизация пользовательского интерфейса для служб WCF с использованием CCR
чаю, как использовать CCR (параллелизм и координационную среду выполнения) в сочетании с асинхронной веб-службой WCF.
Это тестовая служба WCF:
public class Service : IService
{
private Accounts.Manager accountManager = new Accounts.Manager();
public IAsyncResult BeginGetAccount(int id, AsyncCallback callback, object state)
{
//How Do I Call the CCR Function without blocking a Thread?
throw new NotImplementedException();
}
public string EndGetAccount(IAsyncResult result)
{
//How Do I Finish the Call and Pass back the Result?
throw new NotImplementedException();
}
}
Он возьмет идентификационный номер и вернет соответствующее имя учетной записи (если есть)
Я написал функцию CCR, которая должна находить подходящие учетные записи (и) (очевидно, нужно много работать - это просто доказательство концепции). Здесь я отклеиваюсь.
Как передать результаты обратно (глобальный порт?) И, что более важно, как подключить CCR к асинхронному вызову службы WCF, не блокируя поток?
public IEnumerator<ITask> GetAccount(int id)
{
SqlDataReader reader = null;
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=BizData;Integrated Security=True;Async=True;");
string query = "SELECT * FROM Account WHERE AccountID = @AccountID";
SqlCommand command = new SqlCommand(query, connection);
SqlParameter accountID = new SqlParameter("AccountID", id);
command.Parameters.Add(accountID);
connection.Open();
yield return Arbiter.Choice(SQLAdapter.GetReader(command),
delegate(SqlDataReader r) { reader = r; },
delegate(Exception e) { Console.Write("Failed to get SQL data"); });
if (reader == null) yield break;
while (reader.Read())
{
Account account = new Account { ID = Convert.ToInt32(reader["AccountID"]),
Name = reader["Account"].ToString(),
ParkingNo = Convert.ToInt32(reader["ParkingNo"]),
Password = reader["Password"].ToString() };
//Post account?
}
connection.Close();
}