Ich stieß auf dieses Problem, wenn 2 verschiedene Benutzer meiner Website einen Produktverkauf zur gleichen Zeit erstellten. Dies sollte 2 verschiedene Anfragen an den Server generieren und 2 verschiedene Verkaufstickets drucken. Das Problem ist, dass, wenn die Serveranforderungen zur gleichen Zeit (oder sehr nahe beieinander) eingehen, beide Zweige die gleichen Tickets drucken, anstatt dass sie jeweils ihr eigenes Ticket drucken.Wenn zwei Benutzer auf die gleiche Methode zugreifen, wird das Ergebnis freigegeben
mein Code hier:
Branch Total CreatedAt ProductSaleId
EBQ Centro Maya 35.00 2016-06-13 15:35:54.743 3263825d-bca3-4d18-bbca-3eebe4c3398a
EBQ PA Chetumal 30.00 2016-06-13 15:35:54.647 01f52d7d-5745-426b-a973-4a701a18b8e4
Dies sind die Einträge DB, 2 verschiedene Zweige einen jeden Verkauf an 15.35.54.
Also, wenn der Verkauf erfolgt, wird PrintReceipt Methode wie folgt genannt:
HelperObjects.ThermalPOS58.PrinterController.PrintReceipt(new InvoiceReceipt()
{
Discount = discount,
InvoiceNumber = "TEST",
SubTotal = decimal.Parse(createProductSale.Total),
Total = total,
Change = createProductSale.Change ?? "0",
ClientAmount = createProductSale.ClientAmount,
InvoiceDateFormatted =
DateTime.UtcNow.ConvertUtcTimeToTimeZone("", User.Identity.GetUserId())
.ToString("dd/MM/yyyy HH:mm:ss"),
BranchName = _unitOfWork.BranchRepository.GetById(branchId).Name,
InvoiceItems = invoiceReceipts,
PrinterName = _unitOfWork.BranchRepository.GetById(branchId).PrinterName,
IsTpv = createProductSale.IsTpv
});
PrintReceipt Methode sieht wie folgt aus:
private static InvoiceReceipt _mappedInvoice ;
public static void PrintReceipt(InvoiceReceipt invoiceReceipt)
{
_mappedInvoice = invoiceReceipt;
var printNodeIntegration = new PrintNodeIntegration();
printNodeIntegration.Print(GetDocument(), invoiceReceipt.PrinterName);
}
Jeder Aufruf seine eigene Rechnung an die PrintReceipt Methode sendet und es funktioniert gut, außer wenn die Verkäufe zur gleichen Zeit gemacht werden. Wenn dies geschieht, drucken beide Zweige den gleichen Beleg. Normalerweise derjenige, der zuerst kam.
Irgendwelche Ideen?
'statische' Mitglieder werden in allen Sitzungen geteilt. Verwenden Sie "Sitzung" oder ermitteln Sie einen anderen Weg, um die Rechnung im Status zu behalten. –
Wo sonst benutzen Sie '_mappedInvoice'? Warum brauchst du überhaupt ein statisches Mitglied? –
Die statische sieht verdächtig, aber sollte dies nicht in dem bereitgestellten Code beeinflussen, es sei denn, es wird in GetDocument() verwendet (große rote Flagge hier, vermute ich); Also, was macht GetDocument() eigentlich? Zeigen Sie den Code für GetDocument() an. Wenn GetDocument() die statische Variable _mappedInvoice verwendet, warum sollte statt "billReceipt" ein static verwendet werden, um GetDocument() zu übergeben? –