C#, Как я могу отправить повреждение в другую sub стандартную программу?

Краткий ответ: ваш график работает, за исключением того, что отфильтрованные значения не окрашены в красный цвет.

Основная проблема заключается в том, что кодировки всегда заменяют свойства меток, как вы можете видеть в этом более простом примере: ссылка редактора

{
  "$schema": "https://vega.github.io/schema/vega-lite/v3.json",
  "description": "A scatterplot showing horsepower and miles per gallons.",
  "data": {"url": "data/cars.json"},
  "mark": {"type": "point", "color": "red"},
  "encoding": {
    "x": {"field": "Horsepower", "type": "quantitative"},
    "y": {"field": "Miles_per_Gallon", "type": "quantitative"},
    "color": {"field": "Origin", "type": "nominal"},
    "shape": {"field": "Origin", "type": "nominal"}
  }
}

enter image description here [ 115]

Обратите внимание, что, хотя мы указываем, что метка должна иметь красный цвет, это переопределяется кодировкой цвета. Это разработано в Vega-Lite, потому что кодировки более специфичны, чем свойства.

Возвращаясь к вашей диаграмме: поскольку вы указываете цветовую кодировку в родительской диаграмме, каждый отдельный слой наследует эту цветовую кодировку, и эти цвета переопределяют "color": "red", который вы указали в отдельных слоях.

Чтобы заставить его делать то, что вы хотите, вы можете переместить цветовую кодировку в отдельные слои (и использовать кодировку detail, чтобы гарантировать, что данные все еще группируются по этому полю). Например ( ссылка для редактора ):

{
  "$schema": "https://vega.github.io/schema/vega-lite/v3.json",
  "data": {...},
  "width": 1000,
  "height": 200,
  "autosize": {"type": "pad", "resize": true},
  "transform": [
    {
      "window": [{"op": "rank", "as": "rank"}],
      "sort": [{"field": "dateTime", "order": "descending"}]
    },
    {"filter": "datum.rank <= 100"}
  ],
  "layer": [
    {
      "mark": {"type": "line"},
      "encoding": {
        "color": {
          "field": "name",
          "type": "nominal",
          "legend": {"title": "Type"}
        }
      }
    },
    {
      "mark": {"type": "line", "color": "red"},
      "transform": [
        {
          "as": "count",
          "calculate": "if(datum.anomaly == true, datum.count, null)"
        },
        {"calculate": "true", "as": "baseline"}
      ]
    },
    {
      "mark": {"type": "circle", "color": "red"},
      "transform": [
        {"filter": "datum.anomaly == true"},
        {"calculate": "true", "as": "baseline"}
      ]
    }
  ],
  "encoding": {
    "x": {
      "field": "dateTime",
      "type": "temporal",
      "timeUnit": "hoursminutesseconds",
      "sort": {"field": "dateTime", "op": "count", "order": "descending"},
      "axis": {"title": "Time", "grid": false}
    },
    "y": {
      "field": "count",
      "type": "quantitative",
      "axis": {"title": "Count", "grid": false}
    },
    "detail": {"field": "name", "type": "nominal"}
  }
}

8
задан chakrit 27 October 2008 в 23:32
поделиться

6 ответов

Можно выполнить его в его собственном потоке и прервать поток. Просто остерегайтесь этого, которое могло бы оставить операцию в плохом состоянии.

Вместо этого необходимо создать флаг выхода, который поток проверяет в safepoints. Если это будет отмечено для выхода, то поток остановится, как только для него безопасно сделать так.

13
ответ дан 5 December 2019 в 06:10
поделиться

Поскольку Mark сказал, что необходимо реализовать некоторую совместную синхронизацию. Люди часто гравитируют к желанию использовать Поток. Прервитесь здесь..., но это - плохая идея.

Существует много вопросов, которые обращаются к этому, например, видят: "Есть ли хороший метод в C# для выдачи исключения на данном потоке".

0
ответ дан 5 December 2019 в 06:10
поделиться

Можно просто использовать компонент BackgroundWorker.

Это основано на событии и очень легко использовать. Выглядит очень подходящим для того, что Вы описываете.

Это имеет хорошую поддержку передачи сигналов отмены, а также прогресса, сообщающего также.

И много примеров кода Вы можете поиск на Google.


Установите свойство WorkerSupportsCancellation, таким образом, это верно.

backgroundworker1.WorkerSupportsCancellation = true;

Сделайте это перед запуском рабочего.

Затем в цикле можно опросить свойство CancellationPending:

if (backgroundWorker1.CancellationPending) return;

Просто пример, но необходимо получить идею.

13
ответ дан 5 December 2019 в 06:10
поделиться

Установите WorkerSupportsCancellation свойство на Вашем BackgroundWorker к истинному :-)

Вы также добрались для проверки CancellationPending свойство в Вашем цикле, чтобы видеть, необходимо ли прерывать обработку. Статья MSDN, что связанный chakrit имеет хороший блок кода кода

Править: D'oh, Вы получили меня на несколько секунд там chakrit :)

0
ответ дан 5 December 2019 в 06:10
поделиться

спасибо за ответы. Это - a backgroundworker но когда я использую backgroundworker1.cancelAsync(); Я получаю исключение:

"Этот BackgroundWorker заявляет, что не поддерживает отмену. Измените WorkerSupportsCancellation, чтобы указать, что он действительно поддерживает отмену"

Как я иду об изменении этого? Это наследовано код, извините!

1
ответ дан 5 December 2019 в 06:10
поделиться

Можно добавить кнопку отмены, которая устанавливает булев флаг

В цикле добавляют "Приложение. DoEvents" в ключевых пунктах и затем проверяют булев флаг. Если флаг был смещен, формует Вашу очистку и выходит из цикла.

0
ответ дан 5 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: