2016-07-05 3 views
4

Я программирую API для своего программного обеспечения, у которого много интерфейсов, и мое программное обеспечение просто наследует их.
Я хочу, чтобы пользователи API, чтобы иметь возможность сделать что-то после X миллисекунд, что-то вроде этого:Действия API отсрочки

public void PerformAction(Action action, int delay) 
{ 
    Task.Run(async delegate 
    { 
     await Task.Delay(delai); 
     Form.BeginInvoke(action); 
     // I invoke on the Form because I think its better that the action executes in my main thread, which is the same as my form's thread 
    }); 
} 

Теперь я знаю, что задача, как новую тему, я просто хочу знать, это плохо для моего программного обеспечения? Есть ли другой лучший способ?
Метода будет выполнен много, так что я не знаю, является ли этот подход является хорошим или плохим

+3

Почему вы не просто изменить '' PerformAction' в асинхронном Task', а затем просто позвонить 'ждут Task.Delay(); action(); '? Запуск задачи просто для ее спящего режима, а затем попытаться вернуться к потоку пользовательского интерфейса. * Очень * свернуто –

+0

Поскольку мне нужно, чтобы пользователи API использовали его так: Client.PerformAction (TheyAction, 1000); потому что не каждый пользователь будет знать использование задач/async – Haytam

+1

На самом деле они это делают, потому что сама каркаса полна асинхронных методов. Вы не можете запрограммировать .NET, если вы не знаете о задачах –

ответ

6

Вы не должны создавать новую задачу для этого, вы можете вместо этого сделать метод Целевым, что-то вроде этого:

public async Task PerformAction(Action action, int delay) 
{ 
    await Task.Delay(delay); 
    action(); //this way you don't have to invoke the UI thread since you are already on it 
} 

а потом просто использовать его как это:

public async void Butto1_Click(object sender, EventArgs e) 
{ 
    await PerformAction(() => MessageBox.Show("Hello world"), 500); 
} 
+0

Что делать, если они выполнили метод в новом потоке, который они создали? – Haytam

+0

@HaitamZanid в этом случае вам нужно сначала вызвать поток пользовательского интерфейса. Вы также можете объяснить, как использовать API и позволить пользователям API читать его, когда они сталкиваются с Exception –

+0

So Form.BeginInvoke (действие); это плохая идея? – Haytam

0
public async Task PerformAction(Action action, int delay) 
    { 
     await Task.Delay(delay); 
     action(); 
    } 
+0

'async void' - очень плохая идея, потому что его нельзя ждать, а исключения не могут быть обработаны. Его следует использовать только для обработчиков событий (или аналогичных методов с использованием семантики «огонь-и-забыть»). –

+0

Пожалуйста, по крайней мере, попробуйте объяснить свой код. –

+0

@PanagiotisKanavos. В основном согласен, однако, это нормально использовать в UI-событии. cFrozenDeath имеет лучший ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^