[JsonProperty(PropertyName = "start", Required = Required.Always)]
public long? start { get; set; }
if (!outRequest.start.HasValue && !outRequest.finish.HasValue && !outRequest.template.HasValue)
{
outRequest = null;
}
[JsonConverter(typeof(ORequestConverter))]
public sealed class ORequest
{
[JsonProperty("start")]
public long? start { get; set; }
[JsonProperty("finish")]
public long? finish { get; set; }
[JsonProperty("template")]
public int? template { get; set; }
}
public class ORequestConverter : JsonConverter
{
public override bool CanWrite
{
get
{
return false;
}
}
public override object ReadJson
(
JsonReader reader,
Type objectType,
object existingValue, JsonSerializer serializer
)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var target = (ORequest)Activator.CreateInstance(objectType);
serializer.Populate(reader, target);
if (!target.start.HasValue && !target.finish.HasValue && !target.template.HasValue)
{
// необходимые поля не найдены или имеют значение null
// возвращаем null
return null;
}
return target;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
private void button2_Click(object sender, EventArgs e) // запуск таймера класс BackgroundWorker
{
// создаем новый экземпляр BackgroundWorker
bw = new BackgroundWorker();
// остальной код
key = true;
// ...
}
EventHandlerList events = (EventHandlerList)typeof(Component).GetProperty
(
"Events",
BindingFlags.NonPublic | BindingFlags.Instance
).GetValue(bw, null);
var k = typeof(BackgroundWorker).GetField
(
"doWorkKey",
BindingFlags.NonPublic | BindingFlags.Static
).GetValue(null);
var handlers = events[k];
Console.WriteLine
(
"Обработчиков {0}",
handlers.GetInvocationList().Length
);
bw.DoWork += (o, eo) =>
{
for (;;)
{
i = time.Time(i);
Thread.Sleep(1000);
// https://msdn.microsoft.com/ru-ru/library/zyzhdc6b.aspx
Invoke(new Action(() => {
Text = "Таймер. Время: " + i;
}));
}
};
<p>
<span class="datetime">
@Html.GetDateTime(DateTime.Now)
</span>
</p>
<p>
<span class="datetime" data-timestamp="@Html.GetTimestamp()">
@Html.GetDateTime(DateTime.Now)
</span>
</p>
<p>Метод <b>Html.GetDateTime</b> вполне может возвращать дату в тегах, тогда будет:</p>
<p>@Html.GetDateTime(DateTime.Now)</p>
<p>а на выходе может быть:<p>
<p>
<span class="datetime" data-timestamp="123">
15.11.2016 21:11:21
</span>
</p>
<p>
<b>timestamp</b> - позволит обойти проблему с форматированием,
при расчете времени на стороне клиента.
</p>
// ServiceReference1 - см. на картинке выше, можно указать любое имя
var client = new ServiceReference1.MerchantWebServiceClient();
// и смотрите какие есть методы в client и что требуется для их использования
// могут быть и другие подводные камни и особенности,
// но свой код взаимодействия писать не придется
// для большинства случаев достаточно будет автоматически созданных классов
SELECT COUNT(*) FROM table WHERE field = value
Почему "SELECT count(*) FROM bigtable;" работает медленно?
Потому что не используется индекс. PostgreSQL выполняет проверку видимости каждой записи и таким образом производит последовательное сканирование всей таблицы. Если вы хотите, вы можете отслеживать количество строк в таблице с помощью триггеров, но это вызовет замедление при операциях записи в таблицу.
Вы можете получить некоторую оценку. Колонка reltuples в таблице pg_class содержит информацию из результата выполнения последнего оператора ANALYZE на эту таблицу. На большой таблице, точность этого значения составляет тысячные доли процента, что вполне достаточно для многих целей.
"Точный" результат count, часто не будет точным долгое время в любом случае; из-за конкурентности MVCC, count будет точным только на момент вызова запущенного запроса SELECT count(*) (или ограничиваться уровнями изоляции транзакций данной транзакции), и может потерять актуальность уже в момент завершения запроса. При постоянной работе транзакций, изменяющий таблицу, два вызова count(*), которые завершатся в одно и то же время могут показать разные значения, если изменяющая транзакция завершилась между их вызовами.
https://wiki.postgresql.org/wiki/Часто_Задаваемые_...
private void Cl_SendMessage(string mess)
{
// если метод вызывается не из потока, к которому привязана форма
// https://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.invokerequired.aspx
if (this.InvokeRequired)
{
// делаем вызов из потока формы
// https://msdn.microsoft.com/ru-ru/library/zyzhdc6b.aspx
this.Invoke(new Action<string>(this.Cl_SendMessage), mess);
// уходим из этого метода
return;
// или можно в условии сделать else
// кому как больше нравится
}
// else {
// код находящийся здесь будет выполняться только если
// текущий поток - это поток в котором находится форма
chatLogTB.Text += mess;
// }
}
case valMetr == 0:
valMetr = 0: // <<===== ошибка, должна быть точка с запятой
break;
case valMetr>1 && valMetr<=49:
valMetr = 30: // <<===== ошибка, должна быть точка с запятой
break;
class ApiAccess : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw new ArgumentNullException("actionContext");
}
if (!this.IsAuthorized(actionContext))
{
return;
}
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
bool isAuthroized = base.IsAuthorized(actionContext);
// логика проверки доступа
IEnumerable<string> authItems;
if (actionContext.Request.Headers.TryGetValues("Authorization", out authItems))
{
var auth = authItems.First().Split(' ');
var token = service.GetToken(auth.Last());
// ...
}
return isAuthroized;
}
}
[ApiAccess]
public class FileServerController : ApiController
{
// ...
}
let url = '/методAPI';
let data = {}; // параметры запроса
let headers = {
'Authorization': 'ANYNAMEHERE ' + sessionStorage.getItem('token')
};
$.ajax({
cache: false,
processData: false,
type: 'POST',
url: url,
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(data),
headers: headers,
success: (result) => {
// успех
},
error: (x, textStatus, errorThrown) => {
// ошибка
// на сервер можно сделать исключение для плохих маркеров доступа
// и проверить, если responseText содержит данный тип исключения,
// то требовать у пользователя повторную авторизацию
if (x.responseText) {
let exception = JSON.parse(x.responseText);
// AccessDeniedException - тип исключения в WebAPI,
// (скорее всего полное имя типа придется указывать)
if (exception.ExceptionType == 'AccessDeniedException') {
// ...
}
}
}
});
var grid, dialog;
grid = $('#grid').grid({
// ваш url, который будет передавать данные из вашей бд
dataSource: '/Grid/GetPlayers',
uiLibrary: 'bootstrap',
// имена полей, которые следует выводить в таблице
columns: [
{ field: 'ID', width: 32 },
{ field: 'Name', sortable: true },
{ field: 'PlaceOfBirth', title: 'Place Of Birth', sortable: true }
],
pager: { limit: 5, sizes: [2, 5, 10, 20] }
});
Update-Package –reinstall
[HttpPost]
public JsonResult GetAccounts(int page, int limit)
{
using (var context = new Database1Entities())
{
// получаем записи для указанной страницы
var result = context.Account.OrderBy(
row => row.AccountID
).Skip((page - 1) * limit).Take(limit).ToArray();
int total = context.Account.Count();
// возвращаем json
return Json(new { records = result, total = total });
}
}
grid = $('#grid').grid({
// ссылка на действие GetAccounts в контроллере Home
// запрос выполняется методом POST
dataSource: { url: '/Home/GetAccounts', method: 'POST' },
uiLibrary: 'bootstrap',
columns: [
{ field: 'AccountID', sortable: true },
{ field: 'FirstName', sortable: true },
{ field: 'LastName', sortable: true },
{ field: 'Company', sortable: true },
{ field: 'Position', sortable: true }
],
pager: { limit: 2, sizes: [2, 5, 10, 20] }
});
<DataGrid x:Name="dataGrid" MouseDown="dataGrid_MouseDown"/>
private void dataGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
var row = DataGridRow.GetRowContainingElement(e.OriginalSource as FrameworkElement);
if (row != null)
{
// dataGrid.SelectedIndex = row.GetIndex();
dataGrid.SelectedItem = row;
}
}
}
public partial class Form1 : Form
{
private Panel TableContainer = new Panel();
private NumericUpDown Columns = new NumericUpDown();
private NumericUpDown Rows = new NumericUpDown();
public Form1()
{
InitializeComponent();
this.Width = 420;
var flowLayoutPanel = new FlowLayoutPanel();
var LabelColumns = new Label();
var LabelRows = new Label();
var Create = new Button();
// панель для редактора таблицы
flowLayoutPanel.SuspendLayout();
flowLayoutPanel.AutoSize = true;
flowLayoutPanel.Controls.Add(LabelColumns);
flowLayoutPanel.Controls.Add(Columns);
flowLayoutPanel.Controls.Add(LabelRows);
flowLayoutPanel.Controls.Add(Rows);
flowLayoutPanel.Controls.Add(Create);
flowLayoutPanel.Dock = DockStyle.Top;
flowLayoutPanel.Location = new Point(0, 0);
LabelColumns.AutoSize = true;
LabelColumns.Dock = DockStyle.Fill;
LabelColumns.ImageAlign = ContentAlignment.MiddleLeft;
LabelColumns.Location = new Point(3, 0);
LabelColumns.Size = new System.Drawing.Size(53, 29);
LabelColumns.Text = "Колонок:";
LabelColumns.TextAlign = ContentAlignment.MiddleLeft;
LabelRows.AutoSize = true;
LabelRows.Dock = DockStyle.Fill;
LabelRows.Location = new Point(117, 0);
LabelRows.Size = new Size(40, 29);
LabelRows.Text = "Строк:";
LabelRows.TextAlign = ContentAlignment.MiddleLeft;
Columns.Dock = DockStyle.Fill;
Columns.Location = new Point(62, 3);
Columns.Minimum = 1;
Columns.Size = new System.Drawing.Size(49, 20);
Columns.Value = 3;
Rows.Dock = DockStyle.Fill;
Rows.Location = new Point(163, 3);
Rows.Minimum = 1;
Rows.Size = new Size(49, 20);
Rows.Value = 2;
Create.AutoSize = true;
Create.Dock = DockStyle.Left;
Create.Location = new Point(218, 3);
Create.Size = new Size(75, 23);
Create.Text = "Создать";
Create.UseVisualStyleBackColor = true;
Create.Click += new System.EventHandler(CreateTable);
// контейнер для вывода готовой таблицы
TableContainer.Dock = DockStyle.Fill;
// добавляем необходимые элементы на форму
this.Controls.Add(flowLayoutPanel);
this.Controls.Add(TableContainer);
this.Controls.SetChildIndex(flowLayoutPanel, 1);
this.Controls.SetChildIndex(TableContainer, 0);
}
private void CreateTable(object sender, EventArgs e)
{
// удаляем предыдущую таблицу
TableContainer.Controls.Clear();
// создаем новую
var tableLayoutPanel = new TableLayoutPanel();
tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
tableLayoutPanel.Visible = true;
tableLayoutPanel.ColumnCount = Convert.ToInt32(Columns.Value);
tableLayoutPanel.RowCount = Convert.ToInt32(Rows.Value);
// генератор случайных чисел для раскраски панелей (чтобы было видно)
var rnd = new Random(DateTime.Now.Millisecond);
// определяем размер одной колонки и строки, в процентах
int width = 100 / tableLayoutPanel.ColumnCount;
int height = 100 / tableLayoutPanel.RowCount;
this.Text = String.Format("{0}x{1}", width, height);
// добавляем колонки и строки
for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
{
// добавляем колонку
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, width));
for (int row = 0; row < tableLayoutPanel.RowCount; row++)
{
// добавляем строку
if (col == 0)
{
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, height));
}
// добавляем цветную панель, чтобы было видно ячейку в таблице
var panel = new Panel();
panel.BackColor = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255));
panel.Dock = DockStyle.Fill;
tableLayoutPanel.Controls.Add(panel, col, row);
}
}
// добавляем таблицу в контейнер
TableContainer.Controls.Add(tableLayoutPanel);
}
}
Выражение await не блокирует поток, в котором оно выполняется. Вместо этого оно указывает компилятору объявить оставшуюся часть асинхронного метода как продолжение ожидаемой задачи. Управление затем возвращается методу, вызвавшему асинхронный метод. Когда задача завершается, она вызывает свое продолжение и возобновляет выполнение асинхронного метода с того места, где она была прервана.
// без ожидания
Console.WriteLine(DateTime.Now);
Task.Run(() => { Thread.Sleep(5000); });
// этот код будет выполнен сразу
Console.WriteLine(DateTime.Now);
// ожидание с await
Console.WriteLine(DateTime.Now);
await Task.Run(() => { Thread.Sleep(5000); });
// этот код будет выполнен, только после завершения выполнения задачи
// текущий (вызывающий) поток не будет приостановлен
// (например, в Windows Form это будет хорошо видно)
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.Now);
var t = Task.Run(() => { Thread.Sleep(5000); });
t.Wait(); // ожидание выполнения задачи
// этот код будет выполнен, только после завершения выполнения задачи
// текущий (вызывающий) поток будет блокирован
// (например, в Windows Form это будет хорошо видно)
Console.WriteLine(DateTime.Now);