小编Car*_*r22的帖子

async Task vs async void

这可能是一个非常愚蠢的问题,但我有以下编码行将RAW图像转换为BitmapImages:

public async void CreateImageThumbnails(string imagePath, int imgId)
{
    await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath));
}
Run Code Online (Sandbox Code Playgroud)

它调用这种方法 CreateThumbnail()

public static BitmapImage CreateThumbnail(string imagePath)
{
    var bitmap = new BitmapImage();

    using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
    {
        bitmap.BeginInit();
        bitmap.DecodePixelWidth = 283;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.StreamSource = stream;
        bitmap.EndInit();
    }

    bitmap.Freeze();

    GC.WaitForPendingFinalizers();
    GC.Collect();

    return bitmap;
}
Run Code Online (Sandbox Code Playgroud)

当使用async Void而不是async Task在我的CreateImageThumbnails方法中时,我的应用程序处理图像(其中29个)比快11秒async Task.为什么会这样?

异步无效 异步无效

异步任务 异步任务

内存使用更加使用void,但操作完成快.我对线程知之甚少,这就是我提出这个问题的原因.有人可以解释为什么会这样吗?

我还做了一些关于什么时候和什么时候不使用的研究 …

c# task void async-await

15
推荐指数
1
解决办法
5396
查看次数

如何在文本框中仅允许数字和减号" - "

我想知道如何只允许数字和文本框中的" - "减号?

这是编码,我只能允许数字:

private void txtDicountSettlement_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    Regex regex = new Regex("[^0-9]+");
    e.Handled = regex.IsMatch(e.Text);
}
Run Code Online (Sandbox Code Playgroud)

c# wpf

6
推荐指数
1
解决办法
8249
查看次数

将数据添加到DataGrid中的特定列

我想创建一个新列,然后在按钮单击事件上向该新列添加值.那可能吗?该列可能在其下方有几行,具体取决于报价中的项目数量.

到目前为止我取得的成就:

我的班级,我的所有信息都存储在其中

public class ViewQuoteItemList
{
    ...
    public double SupplierCost { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以创建我的列并将其绑定到我的ViewQuoteItemList

DataGridTextColumn columnFeedbackSupplier = new DataGridTextColumn();
columnFeedbackSupplier.Binding = new Binding("SupplierCost");
//The header of the column gets it's value from a combobox where you select a company to be added to the datagrid
columnFeedbackSupplier.Header = (cmbFeedbackSelectSupplier.SelectedItem as DisplayItems).Name;
Run Code Online (Sandbox Code Playgroud)

从这里我从不同的数据网格中获取我的引用项目,然后将它们添加到我的第二个数据网格中,我想在其中添加新列及其值

IList list = dgFeedbackAddCost.SelectedItems as IList;
IEnumerable<ViewQuoteItemList> items = list.Cast<ViewQuoteItemList>();

var collection = (from i in items
                  let a = new …
Run Code Online (Sandbox Code Playgroud)

c# wpf datagrid

5
推荐指数
1
解决办法
5387
查看次数

Excel INT等价物

我正在寻找以下Excel公式的C#等价物:

(INT(((4800/1000)/0.415)*2.393)/0.05)
Run Code Online (Sandbox Code Playgroud)

540在Excel中使用上面的公式获得了值,但现在我尝试使用以下代码在C#中执行相同的操作:

Math.Round((((4800 /1000) / 0.415) * 2.393) / 0.05, 0)
Run Code Online (Sandbox Code Playgroud)

我得到了价值553.

如何使用C#编码获得相同的值?

.net c# excel

4
推荐指数
1
解决办法
401
查看次数

如何阻止MainWindow关闭整个应用程序

我正在尝试从我的WPF应用程序中的子窗口关闭我的主窗口.问题是,一旦我试图"关闭"主窗口,我的整个应用程序就会关闭.

这是我的主窗口(pgLogin)的编码:

Window nextWindow = null;
nextWindow = new pgDashboard();
nextWindow.Owner = this;
this.Hide();
nextWindow.Show();
Run Code Online (Sandbox Code Playgroud)

和我的孩子窗口(pgDashboard):

public static T IsWindowOpen<T>(string name = null) where T : Window
{
    var windows = Application.Current.Windows.OfType<T>();
    return string.IsNullOrEmpty(name) ? windows.FirstOrDefault() : windows.FirstOrDefault(w => w.Name.Equals(name));
}


private void HAZEDashboard_Loaded(object sender, RoutedEventArgs e)
{
    var credentials = this.Owner as pgLogin;
    credentials.txtEmailAddress.Text.ToString();

    var window = IsWindowOpen<pgLogin>();

    if (window != null)
    {
        window.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法关闭主窗口而不隐藏它仍然保持打开我的孩子窗口?

c# wpf window

4
推荐指数
1
解决办法
442
查看次数

使用Async保存FileStream

我试图将文件(BitmapImage)保存到某个位置,但是一旦我使用async&await我得到一个错误,说该文件正在使用中:

该进程无法访问文件'C:\ Users\...\image1.jpg',因为它正由另一个进程使用.

我的编码:

BitmapImage image = new BitmapImage(new Uri(oldImagePath));
var encoder = new JpegBitmapEncoder() { QualityLevel = 17 };
encoder.Frames.Add(BitmapFrame.Create(image));

using (var filestream = new FileStream(GetImageLocation(), FileMode.Create))
    await Task.Run(() => encoder.Save(filestream)); //Error here
Run Code Online (Sandbox Code Playgroud)

当我使用的代码没有await,代码工作完全正常.我想这可能是因为另一个线程可能正在使用它,但任何人都可以帮助或向我解释我的问题吗?谢谢.

c# wpf async-await

3
推荐指数
1
解决办法
1711
查看次数

在Action <object>列表中使用多个Actions

我正在学习更多关于使用ICommand接口以及如何通过RelayCommand我创建的类执行命令.

首先,我对我想要实现的目标进行了一些研究,但是我找不到任何可以帮助我的东西,或者我真的不知道如何搜索我想要做的事情.另外,我对C#理论的了解并不是很好,所以这对我也不利.

基本上我正在尝试将多个动作发送到我的RelayCommand构造函数,然后遍历List<Action<object>>集合中的所有动作并逐个执行它们.这是我的代码:

RelayCommand类构造函数

public RelayCommand(Predicate<object> canExecute, List<Action<object>> actions)
{
    _canExecute = canExecute;

    foreach (var action in actions)
        _execute = action;
}
Run Code Online (Sandbox Code Playgroud)

然后我的ViewModel中的命令属性

private ICommand _updateExternals;
public ICommand UpdateExternals
{
    get
    {
        if (_updateExternals == null)
        {
            _updateExternals = new RelayCommand(
                x => CanExecute,
                Updater.UpdateExternals(this));//Here is where I am stuck
        }
        return _updateExternals;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道,从其他示例来看,如果我只需要传递单个Action而不是一个Actions列表,那么代码将如下所示:x => Updater.UpdateExternals(this));它会起作用,但只要我有一个Actions列表作为参数我卡住了

所以,如果您还没有猜到,我的问题是:如何通过多个动作发送到我的RelayCommand类?

任何正确方向的帮助将不胜感激,谢谢!

编辑:这是我完整的RelayCommand类,可以更好地了解我在做什么.

public class RelayCommand : …
Run Code Online (Sandbox Code Playgroud)

c# action icommand

3
推荐指数
1
解决办法
1233
查看次数

验证标签内容等于null或string.Empty

我正在尝试检查标签的值是否等于null, " ", string.Empty,但每次我运行编码时,都会收到以下错误:

你调用的对象是空的.

这是我的编码:

if (lblSupplierEmailAddress.Content.ToString() == "") //Error here
{
    MessageBox.Show("A Supplier was selected with no Email Address. Please update the Supplier's Email Address", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
    return;
}
Run Code Online (Sandbox Code Playgroud)

如何检查标签内的字符串值是否等于null?我可能会遗漏一些简单的东西,如果是这样,请忽略我的无能:P

c# wpf label

2
推荐指数
1
解决办法
4244
查看次数

在XAML中将WPF窗口的启动位置更改为右下

是否有可能设置手动启动位置在XAML WPF窗口中启动右下角屏幕一角?我可以在代码隐藏区中进行操作,但是当窗口打开时,它会在手动位置(屏幕的左中角)弹出,然后跳到屏幕的右下角,看起来不太好。

我可以使用以下代码在XAML的角的左上角设置位置:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="500" Width="500"
    WindowStartupLocation="Manual" 
    Left="0" Top="0">
</Window>
Run Code Online (Sandbox Code Playgroud)

我可以使用XAML编码对屏幕的右下角执行相同的操作以适合任何屏幕尺寸吗?

c# wpf xaml

2
推荐指数
1
解决办法
4221
查看次数

无法将 Class 转换为 ObservableCollection

我正在尝试将我的课程转换AllStock为,ObservableCollection<AllStock> stockList但出现以下错误:

'System.Collections.ObjectModel.Collection.Add(Haze.AllStock)' 的最佳重载方法匹配有一些无效参数

这是我的编码:

我创建了我的 Observable 集合 -

private ObservableCollection<AllStock> _stockList;
public ObservableCollection<AllStock> stockList
{
    get
    {
        if (_stockList == null)
            _stockList = new ObservableCollection<AllStock>();
        return _stockList;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的方法里面 -

var allStock = await service.GetSysproStockAsync();
var stock = allStock.Select(x =>
new AllStock
{
    Id = x.Id,
    ...
    MaterialThickness = x.MaterialThickness
});

stockList.Add(stock); //Error here - I want to add my 'var stock' to my ObservableCollection
dgSysproStock.ItemsSource = stockList;
Run Code Online (Sandbox Code Playgroud)

为什么会抛出这个错误?

.net c# wpf observablecollection

2
推荐指数
1
解决办法
431
查看次数

给字符串一个空值

我需要一些有关如何在下面的代码片段中将此字符串设置为null值的信息.

[Index(IsUnique = true)]
[StringLength(450)]
public string StockCode
{
    get { return _stockCode; }
    set { _stockCode = value.ToUpper(); } //(ToUpper)<<-- Error
}
Run Code Online (Sandbox Code Playgroud)

当我尝试以正常方式执行此操作时,public string? StockCode我得到了错误,.ToUpper并说:

'System.Nullable'不包含'ToUpper'的定义,并且没有扩展方法'ToUpper'可以找到接受类型'System.Nullable'的第一个参数(你是否缺少using指令或汇编引用?)

我不是专家或专业C#编码器,所以我不知道如何将我的字符串设置为空值并仍然使用.ToUpper我试图这样做的方式.:( 任何意见,将不胜感激!

c# linq-to-entities nullable

1
推荐指数
1
解决办法
517
查看次数