У вас есть вложенные синхронизированные {} конструкции в двух местах. Эти конструкции кажутся чем-то странным: нить не реагирует на уведомления вообще и только возобновляется, когда ThreadB (b) завершается. Удалить это:
public class JavaApplication2 {
public static void main(String[] args) {
ThreadB b = new ThreadB();
b.start();
try {
System.out.println(" ### Waiting for notify");
synchronized (b) {
b.wait();
}
System.out.println(" ### Notified");
} catch (InterruptedException e) {
}
System.out.println("### Total is: " + b.total);
}
}
class ThreadB extends Thread {
int total;
@Override
public void run() {
total += 1;
System.out.println(" *** Ready to notify in 5 secs");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println(" *** Notification sent");
synchronized (this) {
notify();
}
System.out.println(" *** 5 sec post notification");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println(" *** ThreadB exits");
}
}
Возможно, что код выше работает корректно: при уведомлении () текущий основной поток возобновляется через 5 секунд и до того, как мы увидим сообщение, которое ThreadB завершает. С notify () закомментировал, что основной поток возобновляется через 10 секунд и после сообщения о прекращении ThreadB, потому что notify () вызывается anywhay из другого кода. Марко Тополник объясняет, почему и откуда происходит этот вызов «за сценой» notify ().
EF Core поможет заполнить значение столбца идентичности после функции SaveChangesAsync
. Например:
Author.cs:
public class Author
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public List<BlogPost> BlogPosts { get; set; }
}
BlogPost.cs:
[111 ]При создании действия автора EF Core поможет заполнить AuthorId после сохранения:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("AuthorId,AuthorName")] Author author)
{
if (ModelState.IsValid)
{
_context.Add(author);
await _context.SaveChangesAsync();
//here you will get id
var id = author.AuthorId;
//redirect to another action with parameter
return RedirectToAction(nameof(Index),new { id=id});
}
return View(author);
}
Затем вы будете перенаправлены на другое действие / представление с параметром, как показано в коде выше.
«Но я еще не знаю ID, потому что он генерируется EF. И я не знаю, как его передать».
author.Author = "AuthorName";
db.SaveChanges ();
int id = author.AuthorId;
blockquote> [ 114] затем передайте его:
RedirectToAction ("BlogPostView", "Controller", id);
blockquote>