Ich glaube nicht, dass ein Kommandozeilentool das kann. ich will keine ateien umwandeln, sondern einen Mp3 Strem on the fly decodieren, etwas daran verändern, ihn wieder encodieren (ob ogg oder mp3 ist mir dabei egal) und ihn weiterstreamen
Undzwar suche ich für ein aktuelles Projekt eine passende Encoder Komponente. Die gibt es zwar eigendlich wie Sand am Meer, aber keine, die völlig managed ist. Das problem: Das ganze soll auch unter Mono laufen. Einen Decoder für Mp3 habe ich schon gefunden http://nlayer.codeplex.com/. Aber Eincoder bis jetzt nur mit Unmanaged Code mit Wrappe. Das kann ich dann unter mono nicht nutzen.
Ich glaube nicht, dass hier ein MemoryStream so sinnvoll ist. Immerhin scheinen die Daten so groß zu sein, dass es sich lohnt einen Fortschrittsbalken zu haben. Und dann sollte man doch eher darauf achten, sie nur einmal im Speicher zu haben, und nicht nochmal als Serialisierte Form. Die Datei scheint doch ganz vernünftig, oder, wenn das geht(ich kenne mich mit WCF nicht sonderlich gut aus) das ganze direkt in den Ausgabestream zu serialisieren.
Was ic mir auch vorstellen könnte, wäre, dass die Anzahl der Elemente die du auf einmal reinkopierst zu groß ist. Versuch sie mal Stück für Stück zu kopieren
Ich kannte den Thread hier bis jetzt noch garnicht oO und habe im Duden nachgesehen. Anscheinend darf man doch Instanz sagen
Zitat von Duden
Bedeutungsübersicht
* für einen Fall, eine Entscheidung zuständige Stelle (besonders eine Behörde o.ýÄ.)
* (Rechtssprache) (im Hinblick auf die Reihenfolge der zur Entscheidung einer Rechtssache zuständigen Instanzen) bestimmte Stufe eines gerichtlichen Verfahrens
* (EDV) einzelne Ausprägung, Exemplar aus einer Klasse von Objekten
Der unterschied zwichen den beiden Varianten ist, dass der ohne yield alle Ergebnisse beim ersten durchlaufen an der Stelle
return products.ToList<Product>();
gesammelt werden. Wenn man die Methode mit yield so verwendet:
var e = GetAllProducts();
foreach(var product in e){
...
wird in der Zeile GetAllProducts() die Methode bis zum ersten yield ausgeführt. Dann geht es weiter zum foreach. Dort wird das erste Ergebnis ausgelesen und die Methode läuft weiter bis zum nächsten usw..
Ich denke einen Performancevorteil bringt es nicht wirklich, bis vllt auf einen Speichergewinn bei einem großen Ergebnis bei dem man viele Ergebnisse aus der Datenbank lädt und dann verarbeitet (wenn man sie in kleinen stücken rauslädt. So bleibt nur ein kleiner Teil im Speicher, und es wird nicht sofort alles geladen.
Bei linq ist es ähnlich.
var products = from product in db.Product
select product;
baut im Grunde erst das Statement zusammen. Erst wenn man da durch itteriert werden die Ergebnisse geladen.
Was noch ziemlich wichtig sind sind Erfolgmomente. Wenn du darauf hinarbeitest, dass du nach 2 Monaten den nächsten Schritt hast, ist das Ermüdent. Besser ist es sich kleine Ziele zu stecken und auch zu sehen, wwas man geschafft hat. Wenn man irgendwo nen Monat reininvestiert, man aber immer noch ne leere Form hat, macht es auch nicht wirklich Spaß.
Du brauchtst eine app.manifest Datei, die in etwa diesen Inhalt hat:
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC-Manifestoptionen
Wenn Sie die Zugangsebene für das Windows-Benutzerkonto ändern möchten, ersetzen Sie den
requestedExecutionLevel-Knoten durch eines der folgenden Elemente.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Durch Angeben des requestedExecutionLevel-Knotens wird die Datei- und Registrierungsvirtualisierung deaktiviert.
Wenn Sie Datei- und Registrierungsvirtualisierung für Abwärts-
kompatibilität verwenden möchten, löschen Sie den requestedExecutionLevel-Knoten.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>->
</application>
</compatibility>
</asmv1:assembly>
(hab ich aus einer meiner Anwendungen kopiert und gekürzt)
So startet die Anwendung immer mit dem entsprechenden Dialog
Die Sql Parameter sind ja gerade defür da, dass man soetwas nicht machen kann. So kann SQL Injection verhindert werden, wenn die Daten durch den Nutzer eingegeben wurden.
Ich habe diese Funktionalität auch einmal gebaut und das mit Wmi gelöst. Dort gibt es events, die gefeuert werden, wenn ein Prozess startet, und wenn er beendet wird.
Leider bekommt man nicht mitgeteit, was gestartet nd gestoppt wurde, deswegen muss man das dann noch manuell Prüfen.
Dann gibt es bei dem ganzen noch einen Bug, den ich mir trotz längerer Suche nicht erklären konnte. Und zwar implementiert die klasse IDisposable, aber wenn man die Anwendung beendet, gibt es diesen Fehler(bei mir nur wenn der Debuger angeschlossen ist: Ein COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden.
Deswegen einfach Dispose manuell vor dem Schließen aufrufen, dann gibts keine Fehler.
public class ProcessChangeWatcher : IDisposable
{
WqlEventQuery start_query;
WqlEventQuery stop_query;
ManagementEventWatcher start_watcher;
ManagementEventWatcher stop_watcher;
volatile bool _disposed;
event EventHandler _statusChanged;
object _statusChangedLock = new object();
public ChangeWatcher()
{
StartProcessWatching();
}
public event EventHandler StatusChanged
{
add
{
if (_disposed) throw new ObjectDisposedException(ToString());
lock (_statusChangedLock)
_statusChanged += value;
}
remove
{
if (_disposed) throw new ObjectDisposedException(ToString());
lock (_statusChangedLock)
_statusChanged -= value;
}
}
private void StartProcessWatching()
{
if (_disposed) throw new ObjectDisposedException(ToString());
start_query = new WqlEventQuery("Win32_ProcessStartTrace");
start_watcher = new ManagementEventWatcher(start_query);
start_watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
start_watcher.Start();
stop_query = new WqlEventQuery("Win32_ProcessStopTrace");
stop_watcher = new ManagementEventWatcher(stop_query);
stop_watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
stop_watcher.Start();
}
void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
//Changed
if (_disposed) return;
lock (_statusChangedLock)
{
if (_statusChanged != null)
_statusChanged(this, EventArgs.Empty);
}
}
public void Dispose()
{
try
{
if (_disposed) throw new ObjectDisposedException(ToString());
_disposed = true;
start_watcher.EventArrived -= watcher_EventArrived;
stop_watcher.EventArrived -= watcher_EventArrived;
start_watcher.Stopped += (s, e) => start_watcher.Dispose();
stop_watcher.Stopped += (s, e) => stop_watcher.Dispose();
start_watcher.Stop();
stop_watcher.Stop();
}
catch { }
}
}